【问题标题】:ASP.NET MVC 3 url routingASP.NET MVC 3 url 路由
【发布时间】:2012-11-23 21:07:45
【问题描述】:

我在掌握 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);
}

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

【问题讨论】:

  • 您能否显示您用于生成链接的Html.ActionLink 代码?如果您手动输入应该可行的路线,路线是否可行?
  • 嗨,谢谢。当我手动将其输入浏览器时,该路线工作正常。编辑了我的问题以包括控制器和视图。

标签: asp.net-mvc asp.net-mvc-3 model-view-controller


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你的路由工作得很好:

    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)%>
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        也许您需要为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

        【讨论】:

          【解决方案5】:

          如果你愿意,你可以去掉传统的路由, 正如这个人建议的那样here

          如果您按照该指南进行操作,很可能会出现以下情况:

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

          公共 ActionResult 索引(TeamsViewModel 模型) { if (model.teamID != null) model.TeamSummary = new TeamSummaryViewModel(model.teamID);

              return View(model);
          }
          

          【讨论】:

            猜你喜欢
            • 2011-08-11
            • 2011-07-03
            • 2010-11-22
            • 2010-11-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多