在 ASP.NET MVC 中将参数绑定到不同名称的方法?

Mat*_*utt 2 asp.net-mvc

我不断遇到一些场景,我想为操作方法提供一个稍微更直观或“格式良好”的参数名称,但是对于默认行为,这变得非常痛苦。例如,假设我有一个像 GetWidget(int id) 这样的动作参数。如果我希望它是 GetWidget(int widgetId),我必须添加一个新路由。当您使用像 jqGrid 这样的库时,它的查询字符串参数使用糟糕的名称时会变得更糟:GetWidgets(int? nodeid, int? n_level)。相反,我想要 GetWidgets(int? parentId, int? level) 或类似的东西。

那么,我忽略了一些简单的事情吗?告诉 MVC 我的“parentId”参数应该绑定到请求中“nodeid”的值似乎应该是一件非常简单的事情。我想过编写一个自定义操作过滤器来执行此操作,但似乎很明显,以至于我无法相信它不支持开箱即用。

Tan*_*aac 5

根据 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)