使用默认项目模板的基本MVC路由查询

时间:2012-07-31 20:43:36

标签: asp.net-mvc-3

我正在使用基本项目模板和我的几个示例学习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,但是我会问另一个问题,以便更加明确。

非常感谢。

1 个答案:

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

但是,假设您删除了合同路线,只使用默认路线。