12

当使用帮助程序自动生成 Url 时Url.Action,如果页面包含类似于

@Url.Action("编辑","学生")

预计会生成一个类似的 url,domain/student/edit并且它的工作方式与预期的一样。但是如果请求的 url 包含一些参数,比如domain/student/edit/210,上面的代码会使用上一个请求中的这些参数并生成类似的东西,即使我没有为Action方法提供任何这样的参数。

简而言之,如果请求的 url 包含任何参数,则任何自动生成的页面链接(为该请求提供服务)也将包含这些参数,无论我是否在Url.Action方法中指定它们。

怎么了?

4

4 回答 4

20

使用来自这个类似问题的达林的回答。

@Url.Action("Edit","Student", new { ID = "" })
于 2012-10-25T19:24:44.103 回答
9

奇怪,似乎无法重现该问题:

public class HomeController : Controller
{
    public ActionResult Index(string id)
    {
        return View();
    }

    public ActionResult About(string id)
    {
        return View();
    }
}

和里面Index.cshtml

@Url.Action("About", "Home")

现在,当我请求/home/index/123url 助手/home/about按预期生成时。没有鬼参数。那么你的场景有什么不同呢?


更新:

现在您已经阐明了您的方案,您似乎有以下几点:

public class HomeController : Controller
{
    public ActionResult Index(string id)
    {
        return View();
    }
}

并且在Index.cshtml您内部尝试使用:

@Url.Action("Index", "Home")

如果您要求/home/index/123生成/home/index/123而不是预期的/home/index(或仅/考虑默认值)。

此行为是设计使然。如果你想改变它,你将不得不编写你自己的助手来忽略当前的路线数据。以下是它的外观:

@UrlHelper.GenerateUrl(
    "Default", 
    "index", 
    "home", 
    null, 
    Url.RouteCollection, 
    // That's the important part and it is where we kill the current RouteData
    new RequestContext(Html.ViewContext.HttpContext, new RouteData()), 
    false
)

这将生成您期望的正确 url。当然,这是丑陋的。我建议你将它封装成一个可重用的助手。

于 2011-07-14T08:21:14.660 回答
0

使用使用参数并提供 null 的 ActionLink 重载

于 2011-07-14T08:51:12.173 回答
0

您可以为此操作注册自定义路由,例如:

routes.MapRoute("Domain_EditStudentDefault",
            "student/edit",
            new { 
                controller = MVC.Student.Name, 
                action = MVC.Student.ActionNames.Edit,
                ID = UrlParameter.Optional
            },
            new object(),
            new[] { "MySolution.Web.Controllers" }
        );

然后,您可以使用url.RouteUrl("Domain_EditStudentDefault")url RouteUrl 助手覆盖,仅使用routeName参数生成不带参数的 url。

于 2015-09-28T08:37:49.860 回答