Как автоматически включить сегмент в URL с помощью Asp.Net MVC - PullRequest
1 голос
/ 26 августа 2009

Скажем, у меня есть 3 версии веб-сайта: A, B и C. Я хочу, чтобы мои URL были в форме:

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 26 августа 2009

У нас почти то же самое с языком сайта (фрагмент из нашего global.asax.cs):

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

Всякий раз, когда язык не установлен, в нашем случае язык будет установлен на швейцарский немецкий.

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

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

 <%= Html.ActionLink("Linktext", "Action", "Controller", new { siteType = "b" } %>
0 голосов
/ 26 августа 2009

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

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

публичный класс MobileCapableWebFormViewEngine: WebFormViewEngine { public override ViewEngineResult FindView (ControllerContext controllerContext, строка viewName, строка 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")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...