我不断遇到一些场景,我想为操作方法提供一个稍微更直观或“格式良好”的参数名称,但是对于默认行为,这变得非常痛苦。例如,假设我有一个像 GetWidget(int id) 这样的动作参数。如果我希望它是 GetWidget(int widgetId),我必须添加一个新路由。当您使用像 jqGrid 这样的库时,它的查询字符串参数使用糟糕的名称时会变得更糟:GetWidgets(int? nodeid, int? n_level)。相反,我想要 GetWidgets(int? parentId, int? level) 或类似的东西。
那么,我忽略了一些简单的事情吗?告诉 MVC 我的“parentId”参数应该绑定到请求中“nodeid”的值似乎应该是一件非常简单的事情。我想过编写一个自定义操作过滤器来执行此操作,但似乎很明显,以至于我无法相信它不支持开箱即用。
根据 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)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1446 次 |
| 最近记录: |