当使用Url.Action帮助程序自动生成Urls时,如果页面包含类似的行
@Url.Action(“Edit”,”Student”)
预计会产生一个类似域/学生/编辑的URL,并按预期工作.
但是,如果所请求的URL包含一些参数,如domain / student / edit / 210,则上述代码使用上一个请求中的这些参数,即使我没有向Action方法提供任何此类参数,也会生成类似的参数.
简而言之,如果请求的网址包含任何参数,则无论是否在Url.Action方法中指定,页面的任何自动生成的链接(为该请求提供服务)都将包括这些参数.
怎么了?
解决方法
@H_301_16@ 很奇怪,似乎不能重现这个问题: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 / 123 url帮助器按预期生成/ 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.当然这是丑的.我会建议你把它封装成一个可重用的帮手.