在我的mvc2应用程序中,我有一个像
这样的动作链接<%=Html.ActionLink("dash.board", "Index", pck.Controller, new{docid ="",id = pck.PkgID }, new { @class = "here" })%>
docid设置为空字符串,因为我想清除请求上下文中存在的docid的环境值。我在互联网上经历了很多材料,甚至尝试了docid = String.Empty,但它没有解决问题,并给了我像/ controller / action / id?docid = x的网址。我也按照建议here写了一个routeconstraint,但它也没有解决问题。 plz建议我一种方法来清除来自请求上下文与html.actionLink的路由值。我不想使用html.routeLink
答案 0 :(得分:2)
似乎最佳解决方案(没有太多作为解决方法的气味)是解决问题的地方,它有根源和路由。
我编写了一个名为Route
的自定义RouteWithExclusions
类,它可以定义在生成网址时应排除/删除的路由值名称。
整个问题在my blog post中详细说明并解释,所有代码也在那里提供。检查一下,它可以帮助您解决此路由问题。我还编写了另外两个MapRoute
扩展方法,这些方法需要额外的参数。
答案 1 :(得分:1)
这是一个令人沮丧的问题,我敢说它甚至是ASP.Net MVC中的一个错误。幸运的是,使用ActionFilters很容易解决。如果您正在使用MVC3,那么我只是将其作为全局属性来清除环境值。我使这个属性具有歧视性,但您可以更改它以清除所有属性。
这里的假设是,当结果执行时(您的视图最有可能),您已经明确指定了所有ActionLinks和表单操作。因此,这将在它们(链接)被评估之前执行,为您提供生成它们的新基础。
public class ClearAmbientRouteValuesAttribute : ActionFilterAttribute
{
private readonly string[] _keys;
public ClearAmbientRouteValuesAttribute(params string [] keys)
{
if (keys == null)
_keys = new string[0];
_keys = keys;
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
foreach (var key in _keys) {
// Why are you sticking around!!!
filterContext.RequestContext.RouteData.Values.Remove(key);
}
}
}
// Inside your Global.asax
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new ClearAmbientRouteValuesAttribute("format"));
}
希望这有助于某人,因为它确实帮助了我。谢谢你提出这个问题。
答案 2 :(得分:0)
我知道这真的很老了,但我在MVC5中处理这个问题。对于它的价值,这似乎对我有用,我把它放在这里供其他人尝试......
在我正在处理的网站上,我有一个控制器操作,它将日期作为参数,如下所示:
http://localhost:9999/DailyActivity/2014-01-01
但是在页面中,我需要解析为
的链接 http://localhost:9999/DailyActivity
或
http://localhost:9999/DailyActivity/Index
使用此
@Html.ActionLink("Test Link", "Index", "DailyActivity")
令人沮丧地创建了这样的链接:
http://localhost:9999/DailyActivity/2014-01-01
这没有用:
@Html.ActionLink("Test Link", "Index", "DailyActivity", new { date = String.Empty }, null)
因为它创建了这样的链接:
http://localhost:9999/DailyActivity?date=2014-01-01
在敲了敲头之后,我发现的解决方案似乎正常工作。在操作名称中添加斜杠(之前或之后)。然后丢弃环境日期值:
@Html.ActionLink("Test Link", "/Index", "DailyActivity")
这会产生:
http://localhost:9999/DailyActivity/Index
和
@Html.ActionLink("Test Link", "/Index/..", "DailyActivity")
给出
http://localhost:9999/DailyActivity
我还不知道它在路由系统中会产生什么样的影响,但似乎有效...
编辑:
这可能是一个更好的主意(对于默认操作):
@Html.ActionLink("Test Link", String.Empty, "DailyActivity")