繁体   English   中英

基于Http Header值的ASP.NET MVC5 / 6路由

[英]ASP.NET MVC5/6 Routing based on Http Header values

假设我有一个最基本的控制器

public class HomeController : Controller
{
    public ActionResult Index(string id, string language)
    {
        return View();
    }
}

其中包含2个参数。 但是,有一个要求是调用action方法的客户端应该从URL传递id值,而从http头传递language值。 这意味着url应该是/Home/Index/12345 ,同时调用客户端将设置Http Header值language : en

如何在MVC5或MVC6中设置路由以达到要求?

请不要提供来自Web Api的样本。

谢谢

有一个属性FromHeaderAttribute 从其文件:

指定应使用请求标头绑定参数或属性。

您应该能够将其添加到控制器的语言参数中。 默认情况下,它将查找与参数同名的标头,但它还有一个name参数,可用于指定其他名称,例如:

public ActionResult Index(string id, [FromHeader(Name="Accept-Language")]string language)
{
    return View();
}

您还可以查看位于github MVC repo中的测试站点ModelBindingWebSite 检查名为FromHeader_BlogController的控制器。

PS查看HeaderModelBinder的源代码,它似乎可以用于绑定字符串和数组(假设标头有逗号分隔的值列表)

正如Daniel JG所说,您可以使用FromHeaderAttribute绑定Controller操作参数。 但请记住,Controller可以直接访问Request.Headers 停止Controller的语言参数并通过属性访问值作为枚举可能更好:

  public enum LanguageType
  {
     Unknown = -1,
     English,
     Spanish,
     German,
     Chinese
  }

  public LanguageType Language
  {
     get
     {
        string langStr = Request.Headers["Accept-Language"];
        switch (langStr.ToLower())
        {
           case "english":
              return LanguageType.English;
           case "spanish":
              return LanguageType.Spanish;
           case "german":
              return LanguageType.German;
           case "chinese":
              return LanguageType.Chinese;
           default:
              return LanguageType.Unknown;
        }
     }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM