- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
继续我之前的一个问题 ( Unexpected route chosen while generating an outgoing url ),请考虑以下路线(无默认值,无约束):
"{controller}/{month}-{year}/{action}/{user}"
假设在通过匹配此路由的传入 url 呈现某些页面时(因此请求上下文包含每个路由段的值),我需要生成一个仅更改 month
和 year
,保留所有其他段的准确值。
根据规则,我在链接的问题中提到(即 路由系统将仅重用在 URL 模式中早于提供的任何参数出现的段变量的值。),如果我仅通过匿名对象指定新的 month
和 year
,我将丢失 user
段的值(即路由不会甚至匹配)。
我知道有两种方法可以克服这个问题:
完全不要指定匿名对象;但在 context.RouteData.Values
中设置必要的段值;生成所需的 url 后,返回原始值,以便使用原始请求段值执行其余页面渲染;这看起来像这样:
public static MvcHtmlString GetDateUrl(this RequestContext context,
DateTime date)
{
UrlHelper url = new UrlHelper(context);
object month = null, year = null;
if (context.RouteData.Values.ContainsKey("month"))
{
month = context.RouteData.Values["month"];
year = context.RouteData.Values["year"];
}
try
{
context.RouteData.Values["month"] = date.Month;
context.RouteData.Values["year"] = date.Year;
return MvcHtmlString.Create(
url.Action((string)context.RouteData.Values["action"]));
}
finally
{
if (month == null)
{
if (context.RouteData.Values.ContainsKey("month"))
{
context.RouteData.Values.Remove("month");
context.RouteData.Values.Remove("year");
}
}
else
{
context.RouteData.Values["month"] = month;
context.RouteData.Values["year"] = year;
}
}
}
根据当前请求上下文,使用 RouteValueDictionary
而不是匿名对象:
public static MvcHtmlString GetDateUrl(this RequestContext context,
DateTime date)
{
UrlHelper url = new UrlHelper(context);
var values = new RouteValueDictionary(context.RouteData.Values);
values["month"] = date.Month;
values["year"] = date.Year;
string action = (string)context.RouteData.Values["action"];
return MvcHtmlString.Create(url.Action(action, values));
}
第二个选项似乎更简短,而第一个选项不创建额外的字典,操纵请求上下文。
哪种方式更好?或者也许我正在做/理解错误的事情?
Sanderson S., Freeman A. - Pro ASP.NET MVC 3 Framework(第 3 版) 表示不要依赖段值重用,但要在确切位置指定所有需要的值,并且时间。
我展示了我找到的执行此任务的方法,但是如果被替换的路段出现在路线的较早位置,什么是替换路段值并保留其他路段值的正确(或更好)方法?
编辑
基于 Jani Hyytiäinen 的回答。所讨论的路线只是一个例子。目标 mvc 应用程序包含不同的路由,有些可能比这个更复杂。所以我正在寻找的方法应该能够与它们中的任何一个一起使用。我会说这个扩展方法只知道,它必须更改 month
和 year
,同时保留 all 其他段。 other 段的数量是任意的。因此,对所有这些进行硬编码根本不是一个可能的解决方案。此外,除了请求上下文本身,我还有当前段值的来源。
最佳答案
public static MvcHtmlString GetDateUrl(this RequestContext context, DateTime date)
{
var values = context.RouteData.values;
var data = new{
controller = values["controller"] ?? "Home";
action = values["action"] ?? "Index";
month = date.Month;
year = date.Year;
user = context.HttpContext.User.Identity.Name;
};
string url = UrlHelper.RouteUrl(data);
return MvcHtmlString.Create(url);
}
为什么要让它变得更复杂?您可能会争辩说您想要对 HttpContext 进行一些空值检查,但是当您有一个没有 HttpContext 的 RequestContext 时,这里的空值检查是您的问题最少的。要么那个,要么你有一个程序员在做一些非常时髦的事情,你确实希望应用程序在那里吹嘘它所有的荣耀,让他们知道他们正在做一些不起作用的事情,他们应该在它进入之前就停下来生产。
您可能还想对此处的任何其他内容进行额外检查,但实际上,此方法的职责到此为止。它应该接受一个日期并返回一个路由 url 作为 MvcHtmlString。期间。
从性能的角度来看,您可以在生成 url 时在此处明确定义特定的路由名称,但要使其有意义,您需要有相当大的路由集合。考虑到您将在此方法和路由配置之间创建隐藏的依赖关系。有人更改路线名称的那一天,应用程序崩溃了,很难找到原因。
您可能还想使用 RouteValueDictionary,但没有理由。如果我没记错的话,UrlHelper 无论如何都会在内部使用对象。即使我记错了,它也能很好地为你转换。
引用资料:“在确切的时间和地点指定所有需要的值”,Sanderson S.,Freeman A. - Pro ASP.NET MVC 3 Framework
http://msdn.microsoft.com/en-us/library/dd505226(v=vs.108).aspx
关于c# - 如何替换某些段的值以保留其他段的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14229456/
仅使用POSIX shell 的特性,是否有一个“简单命令”,它什么也不做,也不改变$? 的值。人们通常描述:作为 shell 的无操作命令,但这总是设置 $?为零,所以这不是我想要的。 这是生成 s
我需要保留当前的 GlBlendFunc 以便在我做一些工作后可以恢复它。似乎这不是可以用 GLPushAttrib 保存的属性之一,还有其他类似的方法可以用来保存状态吗? 最佳答案 glGet与
我目前正致力于创建 Fuseki 三重存储浏览器的项目。我需要可视化 TripleStore 中的所有数据并使应用程序可浏览。唯一的问题是 QuerySolution 遗漏了三元组中的“”。 如果我使
我知道没有必要保留委托(delegate),以避免保留循环。我在一次采访中碰巧遇到了一个问题,“如果保留了 appDelegate 会怎样?”。我对此没有答案,并根据我的知识在这里寻求答案。谢谢 最佳
我正在用 C 编写第一个更严肃的程序,但我陷入了困境。我需要将此列表排序为不同的单独文件,因此它看起来像这样: BE30B Berlin 2014-04-02 Gale 02 BE30B Berlin
我有 4 个页面,我使用 ajax 和 historyPopState 在它们之间进行更改。但是有一个问题,因为页面非常不同,它们使用不同的样式表和脚本。我可以一遍又一遍地下载它们,但我想问一下是否有
我有一个表单,其中包含从一个表创建的多行(与其他表没有关系)。当我保存表单时,我所做的每项更改都会保存,但数据库中确实有一个额外的空行。请参阅下文(希望)了解所有必要的信息。 PropertyAddi
我正在编写一个可以在 Canvas 上绘制气泡的应用程序。我有 MainActivity,它的布局是一个简单的 LinearLayout,我将其用作 fragment 的容器。当我在 Canvas 上
我想弄清楚为什么我通过这段代码得到 EXC_BAD_ACESS。我没有线索。谁能帮帮我。 - (void)loadJsonFile:(NSString*)fileName { NSError
我正在编写一个代码,它将遍历单词中的每个单词,在字典中查找它们,然后将字典值附加到计数器。但是,如果我打印计数器,我只会从我的 if 语句中获取最后一个数字(如果有的话)。如果我将 print cou
抱歉,标题有点困惑。 我想隐藏这些选择选项,只在用户选择按钮时显示。一旦用户选择了一个按钮,我希望选择字段将继续显示......但是如果用户选择了不同的按钮,我想从以前的选择中重置所选的选项并炫耀。
>>> t = "first%s\n" >>> t = t %("second") >>> print t firstsecond 无论如何我可以保留最后的“\n”并得到“firstsecond\n”
我试图弄清楚如何更改 if 语句中的变量并使其保持全局不变。 用户输入:!change Hi var A = "Hello" if (msg.content.includes ('!change'))
您好,我有一个关于在重新创建 Activity 时保留 fragment 的问题。我听说一种方法是在 onCreate 方法中使用 setRetainFragment(true) 。问题是——这与跟踪
我想知道是否有人可以帮助我解决下面代码中的内存管理问题。我对 rootController 特别感兴趣,它是在我执行 initWithRootViewController 时被保留还是在窗口 addS
我想确保我在这里正确理解了内存管理。是否有任何特殊原因在这里使用其中一种 assignCurrentDate 方法而不是另一种方法?此外,所有这些都不会导致内存泄漏,对吗? 在 .h 中我们有: NS
我对 Angular2 删除尾部斜杠有疑问。我已经设置了我的 dotnet 核心应用程序来添加它们,但是一旦加载了 js,它们就会被删除。 在 Angular2 中甚至可能吗? (我的客户需要它,所以
local_settings.py 反模式的原因之一是把 SECRET_KEY, AWS设置文件中的键等值有问题: secret 通常应该是这样的: secret !将它们保存在版本控制中意味着拥有存
import('./A'); import('./B'); import('./C'); export class Person {}; A、B 和 C 是纯 JS (es5) 库,它们使用全局 wi
df 是一个测试数据框,其中我只想保留 Hits 列中包含 | 字符的行和行其中包含 hits(即 Hit1、Hit2 等)以及 Hits 列中的空白单元格。 df 从开始 (^) 到结束 ($)
我是一名优秀的程序员,十分优秀!