0

我正在使用基本项目模板以及我拥有的几个示例来学习 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
        );

这工作正常,因为它从我的合同控制器返回预期的操作视图。

但是我想修改它以接受 id 到 List 操作中。我知道我需要更改 List 方法以接受参数,那里没有问题,但是路由问题以及如何将此参数从 _Layout.cshtml 文件中的 RouteLink 传递到 List 方法。我已经尝试了一些东西,但这一点真的让我很难过。

我打算从我通过 AccountController 登录的用户传递一个 id,但是我会问另一个问题以保持这个更简洁。

非常感谢。

4

1 回答 1

1

您实际上并不需要您的 Contract 路由,因为您的 Default 路由将适用于与模式 controller/action/(此处为可选 id 参数)对应的任何控制器和操作。看到模板中的注释实际上说Parameter defaults. 这意味着,如果没有传入 Controller、Action 或 id,它将默认为这些值。这就是为什么您可以只浏览到网站的根目录,而 Home 控制器的 Index 操作是默认调用。

使用路由时,您需要记住路由参数名称需要与您的操作中的参数名称匹配。例如,您的默认路由当前允许您这样做:

[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
    );

..您的索引操作将不再正确绑定整数参数..您必须将操作更改为:

[HttpGet]
public ActionResult MyAction(int myIDParameter) {

}

在回答您的问题时,使用 ActionLink 可能更有意义,就像您已经拥有的其他两个一样:

@Html.ActionLink("Contracts", "Contract", "ActionMethodHere", new { id = UserIdHere }, null)

不过,这假设您删除了您的 Contract 路由并仅使用默认路由。

于 2012-08-04T10:30:11.877 回答