如何使用Asp.Net MVC自动在网址中包含细分

时间:2009-08-26 11:10:08

标签: asp.net-mvc routing

假设我有一个网站的3个版本:A,B和C.我希望我的网址形式为:

{siteType}/{controller}/{action}/{id}

其中siteType等于abc

当用户在网站的A版本中时,他们应该留在那里;因此,所有生成的网址都应该具有a的网站类型。同样适用于B和C.

我不想在生成网址时明确指定siteType - 我希望它自动生成。此外,siteType参数只能在一个地方使用 - 基本控制器类中的覆盖RenderView方法 - 它将使用siteType参数为该版本选择正确的视图,css等的网站。因此,我对siteType对我的行为的论证毫无兴趣。只有RenderView方法才需要访问它。

实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我们与网站语言(我们的global.asax.cs的片段)几乎相同:

routes.MapRoute(
            "DefaultLanguage",
            "{lang}/{controller}/{action}/{id}",
            new { lang = "de-CH", controller = "Home", action = "Index", id = "" }
        );

每当没有设置语言时,语言将被设置为swiss-german。

任何actionlink都会自动从当前网站获取语言代码。因此,我们不必在Actionlinks上指定任何语言。

更改siteType很简单,只需将routeValues添加到actionlink即可。 e.g。

 <%= Html.ActionLink("Linktext", "Action", "Controller", new { siteType = "b" } %>

答案 1 :(得分:0)

我可能非常偏离基础,但对我来说听起来像是一个移动网站a-la

http://weblogs.asp.net/mschwarz/archive/2007/11/26/mvc-framework-and-mobile-device.aspx

  公共课   MobileCapableWebFormViewEngine:   WebFormViewEngine {       public override ViewEngineResult FindView(ControllerContext   controllerContext,string viewName,   string masterName,bool useCache)       {           ViewEngineResult result = null;           var request = controllerContext.HttpContext.Request;

    // Avoid unnecessary checks if this device isn't suspected to be a  mobile device
    if (request.Browser.IsMobileDevice)
    {
        result = base.FindView(controllerContext, "A/" + viewName, masterName, useCache);
    }

    //Fall back to desktop view if no other view has been selected
    if (result == null || result.View == null)
    {
        result = base.FindView(controllerContext, viewName, masterName, useCache);
    }

    return result;
} }

您也可以代替

  

Request.Browser.IsMobileDevice

  

Request.ServerVariables [“URL”]。包含(“A”)