2008-09-08 29 views
5

我有一個這樣的動作:ASP.NET MVC預覽4 - 停止Url.RouteUrl()等使用現有的參數

public class News : System.Web.Mvc.Controller 
{ 
    public ActionResult Archive(int year) 
    { 
    /***/
    } 
} 

有了這樣的路線:

routes.MapRoute(
      "News-Archive",            
      "News.mvc/Archive/{year}",       
      new { controller = "News", action = "Archive" } 
     ); 

的網址我是對是:

News.mvc/Archive/2008 

我有一個表格此頁面這樣的:

<form> 
    <select name="year"> 
     <option value="2007">2007</option> 
    </select> 
</form> 

如果在窗體中選擇了「2007」,提交表單應轉到News.mvc/Archive/2007。

這需要表單'action'屬性爲「News.mvc/Archive」。

但是,如果我宣佈這樣的形式:

<form method="get" action="<%=Url.RouteUrl("News-Archive")%>"> 

它呈現爲:

<form method="get" action="/News.mvc/Archive/2008"> 

可有人請讓我知道我錯過了什麼?

回答

2

我覺得你有幾個問題。

首先,您的路由沒有「年」的默認值,因此URL「/ News.mvc/Archive」實際上無法用於路由目的。

其次,您希望表單值顯示爲路由參數,但這不是HTML工作原理。如果您使用帶有select和submit的純文本格式,那麼您的網址最終會以「?year = 2007」結尾。這就是GET方法表單被設計爲如何在HTML中工作的方式。

所以你需要得出一些關於什麼是重要的結論。

  • 如果你希望用戶能夠從下拉列表中選擇的東西,改變提交URL,那麼你將不得不使用JavaScript來實現這一目標(通過截獲表單提交,制定正確的URL)。
  • 如果您可以使用/News.mvc/Archive?year=2007作爲您的網址,那麼您應該完全從路線中刪除{year}指示符。您仍然可以在操作中保留「int year」參數,因爲表單值也會填充操作方法參數。
+0

在正確的軌道。 有關更多詳細信息,請參見有問題的編輯意見。 – 2008-09-08 05:57:45

0

我想我已經制定了爲什麼 - 路線包括{年份}所以生成的路由總是會太..

如果任何人都可以證實這一點?

0

解決方案

好這裏是解決方案,(感謝布拉德領導我那裏)。

1)中的路線需要缺省值:

routes.MapRoute(
     "News-Archive",            
     "News.mvc/Archive/{year}",       
     new { controller = "News", action = "Archive", year = 0 } 
    ); 

2)添加一個重定向到解析GET參數,就好像它們是URL段。

public ActionResult Archive(int year) 
{ 
    if (!String.IsNullOrEmpty(Request["year"])) 
    { 
     return RedirectToAction("Archive", new { year = Request["year"] }); 
    } 
} 

3)確保你有你的請求重定向代碼PARAMS 之前任何代碼重定向「默認」的一年條目。即

public ActionResult Archive(int year) 
{ 
    if (!String.IsNullOrEmpty(Request["year"])) 
    { 
     return RedirectToAction("Archive", new { year = Request["year"] }); 
    } 
    if (year == 0) 
    { 
     /* ... */ 
    } 
    /* ... */ 
} 

3)明確指定Url.RouteUrl()調用了一年的默認值:

Url.RouteUrl("News-Archive", new { year = 0 })