Asp.net mvc 如何在ASP.NET MVC中将参数绑定到其他名称?

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)或类似

我经常遇到这样的场景,我想为动作方法提供一个稍微更直观的或“格式良好”的参数名,但对于默认行为,这是非常痛苦的。例如,假设我有一个像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到底有多“漂亮”?