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.这显然是绑定问题.
如何解决:
为模型绑定器创建一个类:
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)为自定义模型绑定创建自定义属性:
[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)根据需要将新属性应用于您的操作参数:
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)