【问题标题】:Alternate names for querystring parameters查询字符串参数的备用名称
【发布时间】:2013-08-03 07:46:50
【问题描述】:

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

我有这个简单的控制器索引操作:

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

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

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

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

【问题讨论】:

标签: c# asp.net-mvc


【解决方案1】:

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

您可以编写自定义模型绑定器。

就像在每个 ASP.NET MVC 应用程序中一样,您首先要编写一个视图模型:

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

然后是这个模型的模型绑定器:

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());

现在您的控制器操作可以将视图模型作为参数:

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

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

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

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

【讨论】:

  • 谢谢,我实现了一个自定义模型绑定器 - 完美运行。 :)
【解决方案2】:

第二个控制器具有本地化/漂亮名称,其中动作和参数具有本地化名称并从默认/英文控制器调用动作?使用这种方法,您可以本地化 url 的所有部分。

Controller mypage
{
    ActionResult Index(string color)
    {
        // normal code
    }
}

Controller meineseite
{
    ActionResult Index(string farbe)
    {
        return mypage.Index(farbe);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多