c# - 查询字符串参数的备用名称

标签 c# asp.net-mvc

是否可以在 ASP.NET MVC 中为查询字符串参数设置备用名称?

我有这个简单的 Controller 索引操作:

public ActionResult Index(color = "")
{
    ...
}

调用 http://mysite.com/mypage/?color=yellow 效果很好,color 参数自动从查询字符串中获取其值“yellow” .

但现在我想要同一页面的本地化变体,具有“漂亮”的本地化参数,但仍使用相同的 Controller 方法。示例:http://mysite.com/mypage/?farve=gul。在这里,我希望将“gul”作为 color 参数传递给默认的 Index() 方法。

如何为查询字符串参数的备用名称设置映射?

最佳答案

How do I set mappings for alternate names for querystring parameters?

您可以编写自定义模型 Binder 。

因此,就像在每个 ASP.NET MVC 应用程序中一样,您从编写 View 模型开始:

public class MyViewModel
{
    public string Color { get; set; }
}

然后是这个模型的模型 Binder :

public class MyViewModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var query = controllerContext.HttpContext.Request.QueryString;
        var value = query["color"] ?? query["gul"] ?? query["couleur"];
        return new MyViewModel
        {
            Color = value,
        };
    }
}

将在您的 Application_Start 注册:

ModelBinders.Binders.Add(typeof(MyViewModel), new MyViewModelBinder());

现在您的 Controller 操作可以将 View 模型作为参数:

public ActionResult Index(MyViewModel model)
{
    ...
}

当然,您可以通过在属性上使用一些自定义属性来使模型绑定(bind)器更加灵活:

public class MyViewModel
{
    [PossibleQueries("color", "gul", "couleur")]
    public string Color { get; set; }
}

并在模型 Binder 中读取这些值并尝试从查询字符串中读取它们,直到找到一个不为空的值。

关于c# - 查询字符串参数的备用名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18010118/

相关文章:

c# - LINQ <Where> 在 C# 中有条件?

c# - MVC4忽略参数

c# - 通过反射将 Action<T> 传递给泛型方法?

c# - 有没有办法在 ASP.NET MVC 3 RC2 中禁用 JSON ModelBinder?

c# - Mvc Api 从请求中获取凭证

c# - Automapper 返回空对象,源对象不为空。为什么会这样?

c# - 重新绑定(bind)新数据源时 DataGrid 不更新

c# - Asp.net MVC 批量打印

c# - 在 asp.net MVC web 应用程序中捆绑和缩小 ES6 javascript 文件

asp.net-mvc - 在 MVC Razor View 中显示模型中的 HTML 字符串