mvc2.net如何删除环境路由值

时间:2010-08-10 12:54:18

标签: asp.net-mvc routing

在我的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

3 个答案:

答案 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")