asp.net mvc路由id参数

Par*_*der 16 asp.net asp.net-mvc routing

我正在asp.net mvc的一个网站上工作.我有路

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

这是默认路线.我有一个方法

public ActionResult ErrorPage(int errorno)
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我想用http:// something/mycontroller/Errorpage/1运行此代码, 它就不起作用了.但是如果我将参数名称更改为id errorno 就可以了.

是否必须为此方法使用相同的参数名称?或者我是否需要为这种情况创建单独的路线?

Fen*_*ton 16

选项1

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

public ActionResult ErrorPage(int id)
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

选项2

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

public ActionResult ErrorPage(int errorno)
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

选项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();
}
Run Code Online (Sandbox Code Playgroud)


Ten*_*giz 16

因此,您有一个名为的参数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;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 根据需要将新属性应用于您的操作参数:

    public ActionResult ErrorPage(
    [BindParameter("id")]
    int errorno)
    {
        return View();
    }
    
    Run Code Online (Sandbox Code Playgroud)

现在你的errorno遗嘱将会传递id给你的网址.

注意:您可以id从上面的示例中删除参数,如果您确定只需要解决它id.

采用这种方式也可以绑定其他参数.


小智 6

使用bind属性前缀:

public ActionResult Customer([Bind(Prefix = "id")]string cname) {}
Run Code Online (Sandbox Code Playgroud)