我正在使用基本项目模板和我的几个示例学习MVC 3。事情进展顺利,但现在我正在尝试实施我的控制器,我遇到了一些问题。
到目前为止,我已经修改了_Layout.cshtml文件,以获得一个定义了指定路由的新链接:
<header>
<div id="title">
<h1>My MVC Application</h1>
</div>
<div id="logindisplay">
@Html.Partial("_LogOnPartial")
</div>
<nav>
<ul id="menu">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.RouteLink("Contracts", "Contract")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
</ul>
</nav>
</header>
和我的global.asax.cs文件如下:
routes.MapRoute(
"Contract",
"Contract",
new { controller = "Contract", action = "List", id = UrlParameter.Optional }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
这样可以正常工作,因为它从我的Contract控制器返回预期的动作视图。
但是我想修改它以接受List动作中的id。我知道我需要更改List方法以接受参数,没有问题,但问题是路由以及如何将此参数从_Layout.cshtml文件中的RouteLink传递给List方法。我尝试了一些事情,但这一点真的让我感到难过。
我打算从我通过AccountController登录的用户传递一个id,但是我会问另一个问题,以便更加明确。
非常感谢。
答案 0 :(得分:1)
您实际上并不需要您的合同路线,因为您的默认路线适用于与模式控制器/操作/(此处为可选的id参数)对应的任何控制器和操作。请参阅模板中的评论,实际上是Parameter defaults
。这意味着,如果没有传入Controller,Action或id,它将默认为这些值。这就是为什么你可以浏览到网站的根目录,而家庭控制器的索引操作是默认的调用。
使用路线时,您需要记住路线参数名称需要与您的操作中的参数名称相匹配..例如,您的默认路线目前允许您这样做:
[HttpGet]
public ActionResult MyAction(int id) {
}
但是,如果您将默认路线更改为:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{myIDParameter}", // URL with parameters
new { controller = "Home", action = "Index", myIDParameter = UrlParameter.Optional } // Parameter defaults
);
..您的Index操作将不再正确绑定整数参数..您必须将操作更改为:
[HttpGet]
public ActionResult MyAction(int myIDParameter) {
}
在回答您的问题时,使用ActionLink可能更有意义,就像您已经拥有的其他两个一样:
@Html.ActionLink("Contracts", "Contract", "ActionMethodHere", new { id = UserIdHere }, null)
但是,假设您删除了合同路线,只使用默认路线。