3

默认的 MVC 3 路由配置是
{controller}/{action}/{id}
我的 NEWS 应用程序结构就像

/新闻/最新 10 /新闻/关键/10June2013 / 娱乐/最新10

粗体是控制器,斜体是动作,普通文本是可选参数。
现在我想将新变量语言添加到 url 结构中。

它应该像
/en/ News / Latest10
/ja/ News / Critical /10June2013
/de/ Entertainment / Latest10

我想知道如何在控制器中访问这个语言变量。可能吗?

谢谢

4

1 回答 1

2

为了满足您的需要,将 Route 配置更改为:

routes.MapRoute(
                name: "Language",
                url: "{language}/{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, language="en" },
                constraints: new {language=new LanguageConstraint()}
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

两个关键部分是路线本身{language}/{controller}/{action}/{id}和约束部分new {language=new LanguageConstraint()}

第一部分将选择该{language}部分作为控制器的变量(现在默认为 en)。控制器签名:

 public ActionResult Index(string language) {

将选择新的语言变量。由于向每个控制器添加语言可能看起来很麻烦,您可以创建一个 ViewModelBase 类来传递给每个控制器,该类具有包含语言值的属性,每个后续视图模型类都继承自该语言值。

如果没有约束,路由模式将获取语言部分的 url 中的所有值,并且编写一个正则表达式来匹配所有想要的语言值将是乏味的,我认为编写一个基于 IRouteConstraint 的类更容易,类似于以下内容:

public class LanguageConstraint : IRouteConstraint{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values,
                      RouteDirection routeDirection) {

        //create accepted lanaguages collection from somewhere.
        string[] languageArray = new[]{"en","jp", "de"};

        string language = values["language"].ToString();

        if (string.IsNullOrEmpty(language))
            return false;

        return languageArray.FirstOrDefault(l=>l.Equals(language,StringComparison.InvariantCultureIgnoreCase)) != null;
    }
}

只需创建一个已知语言值的列表,并根据该列表检查提供的语言值。如果不存在则返回 false 并抛出 404。

于 2013-06-16T00:07:55.993 回答