我正在使用 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
更改为 id
有用。
此方法是否必须具有相同的参数名称?或者我是否需要为这种情况创建单独的路由?
最佳答案
因此,您有一个名为 errorno
的参数,并且您希望它具有来自参数 id
的值。这显然是绑定(bind)问题。
如何解决:
为模型绑定(bind)器创建一个类:
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; } }
为自定义模型绑定(bind)创建自定义属性:
[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); } }
根据需要将新属性应用到您的操作参数:
public ActionResult ErrorPage( [BindParameter("id")] int errorno) { return View(); }
现在您的 errorno
将具有该值,该值作为您的网址的 id
传递。
注意:如果您确定只需要为 id
解析参数,则可以从上面的示例中删除参数 id
。
离开这种方式也将允许您绑定(bind)其他参数。
关于asp.net mvc路由id参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2743223/