2010-04-30 54 views
14

我正在asp.net mvc的網站上工作。我有路線asp.net mvc routing id參數

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

這是默認路線。我有一個方法

public ActionResult ErrorPage(int errorno) 
{ 
    return View(); 
} 

現在,如果我要運行與http://something/mycontroller/Errorpage/1 這個代碼不工作。但是,如果我將參數名稱從errorno 更改爲ID,它就可以工作。

該方法是否必須具有相同的參數名稱?還是我需要爲這種情況創建單獨的路線?

+1

重複:http://stackoverflow.com/questions/2030614/asp-net-mvc-action-parameter-naming – 2010-12-10 11:54:41

回答

15

所以,你有一個名爲errorno參數,你希望它有從參數id值。這顯然是具有約束力的問題。

如何解決它:

  1. 創建模型綁定類:

    public class ParameterBinder : IModelBinder 
    { 
        public string ActualParameter { get; private set; } 
    
        public ParameterBinder(string actualParameter) 
        { 
         this.ActualParameter = actualParameter; 
        } 
    
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
        { 
         object id = controllerContext.RouteData.Values[this.ActualParameter]; 
         return id; 
        } 
    } 
    
  2. 創建自定義模型的自定義屬性綁定:

    [AttributeUsage(AttributeTargets.Parameter)] 
    public class BindParameterAttribute : CustomModelBinderAttribute 
    { 
        public string ActualParameter { get; private set; } 
    
        public BindParameterAttribute(string actualParameter) 
        { 
         this.ActualParameter = actualParameter; 
        } 
    
        public override IModelBinder GetBinder() 
        { 
         return new ParameterBinder(this.ActualParameter); 
        } 
    } 
    
  3. 應用根據需要爲您的動作參數添加新屬性:

    public ActionResult ErrorPage(
    [BindParameter("id")] 
    int errorno) 
    { 
        return View(); 
    } 
    

現在你errorno將有值,這是因爲id過去了您的網址。

注意:您可以從上面的示例中刪除參數id,如果您確定需要它,只能解決id

離開這種方式可以讓你綁定其他參數。

0

您可以重命名默認根目錄中的參數(這可能不是一個好主意),也可以在操作方法中重命名它。添加另一個根將無濟於事,因爲它將與缺省值相同,並給出路由引擎無法區分這兩者的url,並且將始終佔用列表中的第一個。

0

嘗試在動作方法中使用與路由表url參數中相同的參數名稱。

global.asx

routes.MapRoute(

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

       ); 

myController的

public ActionResult ErrorPage(int id) 

    { 
     return View(); 
    } 
+2

我知道是這樣工作的。但我不想要它。 – Parminder 2010-04-30 13:52:56

16

選項1

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

public ActionResult ErrorPage(int id) 
{ 
    return View(); 
} 

選項2

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

public ActionResult ErrorPage(int errorno) 
{ 
    return View(); 
} 

選項3

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

public ActionResult ErrorPage(int id) 
{ 
    int errorno = id; 
    return View(); 
} 
1

@Parminder 默認路由可以使用一個參數「id」處理所有操作。我認爲並不是每一個行動都需要這個參數。所以,我改變我的默認路由

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

,您可以添加新的路由:

routes.MapRoute("errorpage", "yourcontroller/errorpage/{errorno}", 
    new {controller="controllername", action="errorpage"}); 

這只是處理您控制研究的名字是「controllername」。如果你想處理所有的控制器,可以補充一點:

routes.MapRoute("errorpage", "{controller}/errorpage/{errorno}", 
    new {controller="controllername", action="errorpage"}); 

這種方法,如果你需要大量的自定義路由將創造在Global.asax中非常代碼。

4

使用綁定屬性前綴:

public ActionResult Customer([Bind(Prefix = "id")]string cname) {}