如何在路由配置中引用常量URL?

时间:2010-05-09 13:43:10

标签: asp.net-mvc routing

假设我在网页中有以下内容

<% using (Html.BeginForm("ShowData", "Summary")) %>
<% { %>
<div class="dropdown"><%=Html.DropDownList("CourseSelection", Model.CourseList, new { @class = "dropdown",  onchange="this.form.submit();" })%> </div>
<% } %>

当用户从下拉列表中进行选择时,表单已提交,我希望它链接到另一个带有URL的页面,如下所示:

http://localhost:1721/Summary

我有以下路线:

    routes.MapRoute(null, "Summary", new { controller = "Summary", action = "ShowData", CourseSelection = (string) null });

    routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Login", action = "Index", id = UrlParameter.Optional });

当用户选择下拉列表中的项目时,返回的URL为:

http://localhost:1721/Summary/ShowData?CourseSelection = UserSelection

显然,列表中的第一条路线未匹配。

我不希望URL显示操作名称和参数。我只是想显示“摘要”,这是我在URL中硬编码的内容。我如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

此处的问题是您的路线有默认值

CourseSelection =(string)null

这不是路线网址的一部分(又名“摘要”)。

在生成URL的任何默认值时都有特殊的逻辑,其中参数在URL中,您指定的参数必须与默认值匹配。

另一种解决方法是:

using (Html.BeginForm("ShowData", "Summary", 
  new {CourseSelection = (string)null})) {
  ...
}

但是,由于您将该值发布到操作中,因此我不明白为什么您在路径中将CourseSelection作为默认值。您只需要它作为一个动作方法参数,它将在发布的表单数据中自动绑定。

所以另一种解决方案是改变你的路线:

routes.MapRoute(null, "Summary", 
  new { controller = "Summary", action = "ShowData" });

答案 1 :(得分:0)

当您查看html源时,

 <% using (Html.BeginForm("UpdateView", "MyController")) %> 
    <% { %> 
    <div class="dropdown"><%=Html.DropDownList("Selection", Model.List, new { onchange="this.form.submit();" })%></div>          
    <% } %> 

您会注意到该操作为空。这是因为帮助程序无法根据您在BeginForm中提供的内容查找路径。

根据您在Global.asax中的定义,所有请求都将默认为Index操作方法。你想要的是:

 routes.MapRoute("Default", "{controller}/{action}", new { controller = "Home", action = "Index" });  

请注意URL模式中操作的附加项。

这适合我。

Global.asax中

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(null, "Summary", new { controller = "Summary", action = "ShowData", CourseSelection = (string)null });

    routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Login", action = "Index", id = UrlParameter.Optional }); 

}

SummaryController

public class SummaryController:Controller {     //     // GET:/ Summary /

public ActionResult Index()
{
    return View();
}

public ActionResult ShowData(string CourseSelection)
{
    return View();
}

默认视图中的代码

<%
    var list = new List<string> { "a", "b", "c" };

    var selList = new SelectList(list); %>
<% using (Html.BeginForm("ShowData", "Summary")) %>
<% { %>
<div class="dropdown">
    <%=Html.DropDownList("CourseSelection", selList, new { @class = "dropdown",  onchange="this.form.submit();" })%>
</div>
<% } %>

}