Asp.net mvc 如何在ASP.NET MVC中将参数绑定到其他名称?
我经常遇到这样的场景,我想为动作方法提供一个稍微更直观的或“格式良好”的参数名,但对于默认行为,这是非常痛苦的。例如,假设我有一个像GetWidget(intid)这样的操作参数。如果我希望它是GetWidget(intwidgetid),我必须添加一个新路由。当您使用像jqGrid这样的库时,情况会变得更糟,它的查询字符串参数使用了糟糕的名称:GetWidgets(int?nodeid,int?n_级别)。相反,我希望有GetWidgets(int?parentId,int?level)或类似的东西Asp.net mvc 如何在ASP.NET MVC中将参数绑定到其他名称?,asp.net-mvc,Asp.net Mvc,我经常遇到这样的场景,我想为动作方法提供一个稍微更直观的或“格式良好”的参数名,但对于默认行为,这是非常痛苦的。例如,假设我有一个像GetWidget(intid)这样的操作参数。如果我希望它是GetWidget(intwidgetid),我必须添加一个新路由。当您使用像jqGrid这样的库时,情况会变得更糟,它的查询字符串参数使用了糟糕的名称:GetWidgets(int?nodeid,int?n_级别)。相反,我希望有GetWidgets(int?parentId,int?level)或类似
那么,有什么简单的东西我忽略了吗?似乎告诉MVC我的“parentId”参数应该绑定到请求中的“nodeid”值应该是一件非常简单的事情。我曾考虑编写一个自定义操作过滤器来实现这一点,但很明显,我不敢相信它不受开箱即用的支持。使用您自己的自定义模型绑定器,它实现了IModelBinder如果您在URL上使用命名参数,您可以在控制器方法中指定参数的特定名称,如下所示:
http://mydomain.com/mycontroller/getwidget?parentid=1&level=2
…而且您不必在参数上匹配路线。根据Rony的回答,使用自定义模型活页夹。以下是一个例子:
public class BindToAliasAttribute : CustomModelBinderAttribute
{
private readonly string parameterAlias;
public BindToAliasAttribute(string parameterAlias)
{
this.parameterAlias = parameterAlias;
}
public override IModelBinder GetBinder()
{
return new ParameterWithAliasModelBinder(parameterAlias);
}
}
public class ParameterWithAliasModelBinder : IModelBinder
{
private readonly string parameterAlias;
public ParameterWithAliasModelBinder(string parameterAlias)
{
this.parameterAlias = parameterAlias;
}
object IModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
return controllerContext.RouteData.Values[parameterAlias];
}
}
public class UserController : Controller
{
[HttpGet]
public ActionResult Show( [BindToAlias("id")] string username)
{
...
}
}
问题是,它是一个第三部分库,正在生成查询字符串参数,并且它使用了难看的名称(如n_level)。我可以编辑源代码,但我想避免这种情况。我同意Robert的观点……如果您没有定义特殊的路由,那么丑陋的参数名称将作为querystring参数附加在问号之后。你唯一要牺牲的就是“漂亮”的URL。但是,像“n_level”这样名字的URL到底有多“漂亮”?