2010-04-30 57 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) {}