asp.net mvc routing id parameter

前端 未结 6 879
自闭症患者
自闭症患者 2020-12-29 07:04

I am working on a website in asp.net mvc. I have a route

routes.MapRoute(
    \"Default\", // Route name
    \"{controller}/{action}/{id}\", // URL with pa         


        
相关标签:
6条回答
  • 2020-12-29 07:43

    You could either rename the parameter in the default root (which probably is not a good idea) or rename it in the action method. Adding another root will not help because it will be the same as the default one and given an url the routing engine cannot distinguish between the two and will always take the first one in the list.

    0 讨论(0)
  • 2020-12-29 07:58

    Option 1

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
    
    public ActionResult ErrorPage(int id)
    {
        return View();
    }
    

    Option 2

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{errorno}",
        new { controller = "Home", action = "Index", errorno = UrlParameter.Optional }
    );
    
    public ActionResult ErrorPage(int errorno)
    {
        return View();
    }
    

    Option 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();
    }
    
    0 讨论(0)
  • 2020-12-29 08:00

    So, you have a parameter named errorno, and you want it to have a value from parameter id. This is obviously the binding problem.

    How to solve it:

    1. create a class for model binder:

      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. create a custom attribute for custom model binding:

      [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. apply the new attribute to your action parameters as needed:

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

    Now your errorno will have the value, which was passed as id for your url.

    Note: you can remove the paramter id from the example above, if you are sure you need it solved only for id.

    Leaving this way will allow you bind other parameters too.

    0 讨论(0)
  • 2020-12-29 08:03

    use the bind attribute prefix:

    public ActionResult Customer([Bind(Prefix = "id")]string cname) {}
    
    0 讨论(0)
  • 2020-12-29 08:03

    @Parminder The default route can handle all action with one parameter "id". And I think not every action need this parameter. So I change my default route

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

    and you can add a new route:

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

    this just handle your controll name is "controllername". If you want to handle all controller, you can add this:

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

    This method will create very much code in global.asax if you need a lot of custom route.

    0 讨论(0)
  • 2020-12-29 08:06

    try to use the same name of parameter in action method as in in the route table url parameter.

    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();
        }
    
    0 讨论(0)
提交回复
热议问题