2

我在掌握 MVC 路由时遇到了一些麻烦。我读了又读,仍然没有多大意义。我正在尝试映射路线“Teams/Summary?teamID=30”,以便它在浏览器中显示“Teams/30”。这就是我目前所拥有的,但我不明白为什么它不起作用:

//Teams routes
routes.MapRoute(
        "TeamsSummary",
        "Teams/{teamID}",
        new { controller = "Teams", action = "Index", teamID = UrlParameter.Optional }
    );

“不起作用”是指网页已加载,但仍会在浏览器地址栏中显示“Teams?teamID=30”。

有人可以帮助我了解执行如此简单的映射需要做什么吗?顺便说一句,我没有设置任何其他我认为会干扰的路由,并且它列在我的 Global.asax.cs 文件中的默认路由之前。

如果你有一些关于这个主题的好文章和教程,那也会很有帮助。谢谢。

编辑: 如果我手动输入 URL,路由工作正常。现在当我使用表单回发到控制器时会出现问题:

控制器:

public ActionResult Index(TeamsViewModel model)
    {
        if (model.teamID != null)
            model.TeamSummary = new TeamSummaryViewModel(model.teamID);

        return View(model);
    }

看法:

@{
ViewBag.Title = "Teams";
}

@using (Html.BeginForm("Index","Teams",FormMethod.Get))
{
    @Html.DropDownList("teamID", new SelectList(Model.Teams,"teamID","Name"))    
    <input type="submit" value="Filter"/>
}
@if (Model.TeamSummary != null)
{
    Html.RenderPartial("_TeamSummary", Model.TeamSummary);
}

Edit2: 将原始操作更改为 TeamsController 上的索引,而不是之前的摘要。

4

5 回答 5

1

乍一看,这条路线似乎没有任何明显的问题。

也许您需要为TeamID? TeamID对参数添加限制以更好地定义路由并允许其他路由下不会有什么坏处Teams

例如

context.MapRoute(
        "TeamsSummary",
        "Teams/{teamID}",
        new { controller = "Teams", action = "Summary", teamID = "" },
        new { teamID = @"\d+" }
    );

更新

你的代码

Html.BeginForm("Index","Teams",FormMethod.Get)

将创建一个表单,将信息作为 GET 而不是 POST 发送回浏览器。这基本上意味着所有输入值都将作为查询字符串值附加......这是在客户端完成的,与 ASP.NET MVC 路由无关。

如果您不熟悉,可以查看关于表单操作的 W3 Schools 文章 - http://www.w3schools.com/tags/att_form_action.asp

于 2012-11-23T21:29:54.513 回答
1

你的路由工作得很好:

Global.asax

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "TeamsSummary",
                "Teams/{teamID}",
                new { controller = "Teams", action = "Summary" }
            );

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

在 html 视图中创建的链接:

<%= Html.ActionLink("Summary", "Summary", "Teams", new {teamID = 11 },null)%>
于 2012-11-24T13:04:24.447 回答
1

发生的情况是在匹配的 TeamsSummary 路由之前定义了另一条路由,您需要更改路由的顺序或添加约束以确保匹配所需的路由。路由可能很棘手,如果您想了解更多信息,我建议您阅读这篇文章

于 2012-11-24T02:44:32.113 回答
1

请检查正确的路由名称,必须与创建 ActionLink 时在 Global.asax 文件中指定的相同。

于 2012-12-11T05:54:39.463 回答
0

如果你愿意,你可以去掉传统的路由,正如这个家伙在这里所建议的那样

如果您遵循该指南,很可能这将是您可能出现的地方:

[Route("Teams/{teamID}")]    

public ActionResult Index(TeamsViewModel model) { if (model.teamID != null) model.TeamSummary = new TeamSummaryViewModel(model.teamID);

    return View(model);
}
于 2015-10-28T07:31:03.530 回答