2009-08-26 1 views
1

Say У меня есть 3 версии веб-сайта: A, B и C. Я хочу, чтобы мои URLs, чтобы быть в форме:Как автоматически включать сегмент в URL с Asp.Net MVC

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

где siteType равно a, b или c.

Когда пользователь находится в версии веб-сайта A, они должны оставаться там; поэтому все сгенерированные URL-адреса должны иметь тип сайта a. Аналогично для B и C.

Я не хочу явно указывать siteType при создании URL-адресов - я хочу, чтобы он сгенерирован автоматически. Кроме того, параметр siteType будет использоваться только в одном месте - переопределенный метод RenderView в классе базового контроллера - который будет использовать параметр siteType для выбора правильного представления, css и т. Д. Для этой версии веб-сайта. Поэтому я не заинтересован в siteType, являющемся аргументом для моих действий. Только метод RenderView требует доступа к нему.

Каков наилучший способ достичь этого?

ответ

1

У нас есть почти то же самое с языком сайта (сниппета из наших Global.asax.cs):

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

Если язык не установлен язык будет установлен на swiss- немецкий в нашем случае.

Любое действие actionlink будет иметь код языка автоматически с текущего сайта. Поэтому нам не нужно указывать какой-либо язык в Actionlinks.

Изменение типа сайта простое, просто добавьте routeValues ​​к вашей ссылке action. например

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

Да, но дело в том, что я не хочу добавлять siteType для каждого ActionLink или к любому другому URL-адресу, который сгенерирован. Поскольку это делается везде, я должен иметь возможность автоматически добавлять его в одном месте. – darasd

+0

вам не нужно добавлять siteType к каждому URL-адресу «рукой». Установите его один раз в стандартной процедуре, и он будет добавлен. Если вы хотите переключиться между SiteTypes, вам нужно добавить siteType к этой ссылке действия. Все мои ссылки похожи на: <% = Html.ActionLink («Linktext», «Action», «Controller»%> за исключением того, что переключает язык. ActionLink отображает ссылку и автоматически добавляет сайтType к чему-то вроде: Linktext griti

+0

Знаете, я думаю, что вы правы! Кажется, это добавлено автоматически, и вместо текущего значения, если не добавить явно, например, ActionLink, следует использовать значение текущего url, а не значение по умолчанию. – darasd

0

я могу быть совершенно вне базы, но то, что это звучит, как мне это мобильный сайт а-ля

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

общественного класса MobileCapableWebFormViewEngine: WebFormViewEngine { общественного переопределение 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"]. Содержит(«А»)

+0

Да, это решает проблему получения правильного представления, но это не решает проблему автоматического добавления атрибута siteType («a») на каждый URL-адрес. – darasd