2010-05-09 46 views
1

假設我有當用戶從表單提交的下拉菜單進行選擇,我想它有一個URL鏈接到另一個頁面,如下所示網頁如何在路由配置中引用常量URL?

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

中的以下內容:

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

這裏的問題是,你的路由具有空

默認值

CourseSelection =(字符串)這不是路由URL(又稱 「摘要」)的一部分。

當生成一個URL,路由的任何默認值,其中而不是在URL中,您指定的參數必須匹配默認值的URL的特殊邏輯。

所以另一種方式來解決這個問題是:

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

但是,因爲你張貼的價值的行動,我不明白你爲什麼CourseSelection在你的路由默認。你只需要它作爲一個動作方法參數,它會在發佈的表單數據中自動綁定。

所以一個替代解決辦法是改變像這樣的路線:

routes.MapRoute(null, "Summary", 
    new { controller = "Summary", action = "ShowData" }); 
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

公共類SummaryController:控制器 { // // GET:/概述/

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

}

+0

對不起,延遲迴復。我一直在做更多的研究,但我仍然很難理解自定義路由如何在mvc中工作。我編輯了我的原始帖子。你還能幫忙嗎? – 2010-05-13 10:16:17