所以我试图在我的 URL 中使用连字符来提高可读性,但到目前为止还没有找到一种方法让它与 mvc4 一起工作。
我将从控制器中的代码开始:
public ViewResult Index()
{
ViewBag.URL = Functions.fetchURL();
return View();
}
[HttpPost]
public ActionResult Index(LogonModel model, string returnUrl)
{
//omitted to save space
return View(model);
}
public ActionResult Forgot_Login_Info()
{
return View();
}
[HttpPost]
public ActionResult Forgot_Login_Info(RetrievePasswordViewModel model)
{
//omitted to save space
return View();
}
因此,我在“Forgot_Login_Info”中看到的操作名称使用下划线,这也是视图的名称。为了测试,我还手动创建了一个名为“Forgot-Login-Info”的视图
在我的 global.asax.cs 文件中,我只是将这一行用于路由
RouteConfig.RegisterRoutes(RouteTable.Routes);
这是 MVC4 新项目的标准路由线,它与“RouteConfig.cs”文件挂钩,在该文件中是我拥有的代码,我在本网站的另一个问题中找到。
public class RouteConfig
{
public class HyphenatedRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-","_");
requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
return base.GetHttpHandler(requestContext);
}
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.Add(
new Route("{controller}/{action}/{id}",
new RouteValueDictionary(
new { controller = "Default", action = "Index", id = UrlParameter.Optional }),
new HyphenatedRouteHandler())
);
}
}
最后这里是“索引”视图的代码,这是我有一个指向“Forgot_Login_Info”的链接的地方。
<div class="centerBlockItem" style="width:450px; text-align:center">
@Html.ActionLink("Forgot Password?", "Forgot-Login-Info")
@Html.ActionLink("Forgot Password?", "Forgot_Login_Info")
</div>
现在我有两种方式的链接,一种使用下划线,另一种使用连字符。根据我所阅读的有关为此目的找到的代码,两个链接都应打开“Forgot_Login_Info”视图,而不是“Forgot-Login-Info”视图。但是我得到的是第二个链接工作正常,并且操作名称与视图文件名称匹配。但是当我点击第一个链接时,我得到一个 404 错误,因为系统找不到“Forgot-Login-Info”视图文件,即使我已经手动创建了一个具有该名称的文件进行测试。
还有一点需要注意,我的 routeconfig 文件中的代码,在我发现的答案中,我建议我注释掉默认路由代码行,然后离开:
routes.Add(
new Route("{controller}/{action}/{id}",
new RouteValueDictionary(
new { controller = "Default", action = "Index", id = UrlParameter.Optional }),
new HyphenatedRouteHandler())
);
我也这样做了,得到了同样的结果。有什么想法让我把事情搞砸了吗?