代码之家  ›  专栏  ›  技术社区  ›  Parminder

ASP.NET MVC路由ID参数

  •  16
  • Parminder  · 技术社区  · 14 年前

    我正在ASP.NET MVC中的一个网站上工作。我有一条路

    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 它起作用了。

    此方法是否必须具有相同的参数名?或者我需要为这种情况创建单独的路由吗?

    6 回复  |  直到 8 年前
        1
  •  16
  •   pb2q    9 年前

    所以,您有一个名为 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();
      }
      

    现在你 厄洛诺 将具有值,该值作为 身份证件 为您的URL。

    注意:您可以删除参数 身份证件 从上面的例子中,如果您确定您只需要为 身份证件 .

    这样做也可以绑定其他参数。

        2
  •  16
  •   Fenton    14 年前

    选项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();
    }
    
        3
  •  5
  •   dier    8 年前

    使用绑定属性前缀:

    public ActionResult Customer([Bind(Prefix = "id")]string cname) {}
    
        4
  •  1
  •   Ian Kemp    8 年前

    @ Parminder 默认路由可以用一个参数“id”处理所有操作。我认为不是每个动作都需要这个参数。所以我改变了我的默认路线

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

    您还可以添加新路线:

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

    这个只是处理你的控制器名称是“控制器名称”。如果要处理所有控制器,可以添加:

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

    如果需要大量的自定义路由,此方法将在global.asax中创建大量代码。

        5
  •  0
  •   Darin Dimitrov    14 年前

    您可以在默认根目录中重命名参数(这可能不是一个好主意),也可以在action方法中重命名参数。添加另一个根目录将不会有帮助,因为它将与默认根目录相同,并且给定一个URL,路由引擎无法区分这两个根目录,并且将始终采用列表中的第一个根目录。

        6
  •  0
  •   Webking    14 年前

    尝试在操作方法中使用与路由表url参数中相同的参数名称。

    全球ASX

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

    MyCube

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