Что не так с маршрутизацией моей области в развернутом приложении bin для MVC4?

Я только что развернул приложение MVC4 .NET 4.0 на своем веб-хосте для "развернутого" развернутого тестирования. Маршруты вне зоны работают нормально, например, мой

@Html.ActionLink("Register as a Client", "Register", "Account", new { registrationType = "Client"}, null)

ссылка работает нормально, и ссылка открывает правильную страницу. Тем не менее, со ссылкой на действие на основе области, как это:

@Html.ActionLink("Authors", "Index", "Home", new { Area = "Author", registrationType = "Author" }, null)

в ссылке, фактически отображаемой в браузере, отсутствует действие и контроллер, т.е.

http://mylivedomain.com/?Area=Author&registrationType=Author

Возможно, стоит отметить, что функция связывания css в MVC4 не работала после развертывания, и я вернулся к использованию ссылок на классические стили для отдельных таблиц стилей.

МОЖЕТ СВЯЗАТЬСЯ: Мой вопрос: почему неизмененный код шаблона в моем приложении MVC4 пытается зарегистрировать области дважды?

ТОЛЬКО В: Удаление действия по умолчанию из отображений маршрута области для маршрута по умолчанию решило эту проблему. В коде шаблона VS2012 для начала не было контроллера по умолчанию.

5 ответов

Попробуйте проверить this.ControllerContext.RouteData.DataTokens["area"] в методах действий вашей области.

У меня была ситуация с похожей проблемой, в которой имя области было просто пустой строкой.

Установка DataToken в методе действия может дать вам быстрое решение, но не отвечает на вопрос, почему MVC не устанавливает имя области.

В вашем случае, поскольку вы указываете область в строке запроса, должны применяться маршруты из Global.asax.cs. Я верю, что у вас есть что-то вроде этого:

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        ).DataTokens.Add("area","Author");
    }

Этот код устанавливает маршрут Home/Index по умолчанию и пропускает Home/Index в URL. Если вы измените controller = "Home" на что-то другое, например controller = "Home2", вы увидите полную ссылку для Home/Index и нового маршрута по умолчанию Home2/Index. Аналогичное применяется к маршрутам по умолчанию в областях, если вы их указали.

With the @Html.ActionLink

use this format

@Html.ActionLink("Authors", "Index", "Home", new { Area = "Author", registrationType = "Author" }, new{})

Решил мою проблему.

В вашем global.asax.cs убедитесь, что у вас есть эта строка в вашем Application_Start:

AreaRegistration.RegisterAllAreas();

В каждой области у вас должен быть AreaRegistration.cs что-то вроде этого:

public class testAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "test";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "test_default",
            "test/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

Случалось ли вам наследовать PortableAreaRegistration от MvcContrib в какой-либо из ваших областей?

Раньше у нас были точно такие же симптомы (работают локально, а не на сервере), пока мы не удалили все PortableAreaRegistrations из Portable Areas и не вернулись к использованию просто AreaRegistration, поскольку MVC4 может зарегистрировать переносную область без каких-либо дополнительных библиотек.

Другие вопросы по тегам