Динамическое расположение для представления ошибок в ASP.Net MVC - PullRequest
2 голосов
/ 11 апреля 2011

У меня есть два действия, которые называются «а» и «б». Также у меня есть два взгляда на них. расположение этих взглядов является разницей. для:

@{
    Layout = "~/Views/Shared/_X.cshtml";
}

для b:

@{
    Layout = "~/Views/Shared/_Y.cshtml";
}

также общий вид ошибок.

Как использовать динамический макет для просмотра ошибок. например, если при обработке действия «а» произошла ошибка, ошибка отображается в макете действия «а», а если при обработке действия «b» произошла ошибка, ошибка отображается в макете действия «b»?

Ответы [ 4 ]

6 голосов
/ 11 апреля 2011

Вы можете написать вспомогательный метод:

public static string GetLayout(this HtmlHelper htmlHelper)
{
    var action = htmlHelper.ViewContext.RouteData.GetRequiredString("action");
    if (string.Equals("a", action, StringComparison.OrdinalIgnoreCase))
    {
        return "~/Views/Shared/_X.cshtml";
    } 
    else if (string.Equals("b", action, StringComparison.OrdinalIgnoreCase))
    {
        return "~/Views/Shared/_Y.cshtml";
    }
    return "~/Views/Shared/_Layout.cshtml";
}

, а затем:

@{
    Layout = Html.GetLayout();
}
1 голос
/ 07 октября 2013

надеюсь, что это поможет вам .... различные способы рендеринга макетов в Asp.Net MVC.

Метод 1: Управление отображением макетов с помощью файла _ViewStart в корневом каталоге папки Views

Мы можем изменить рендеринг макетов по умолчанию в файле _ViewStart, используя следующий код:

@{
var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();

string layout = "";
if (controller == "Admin")
{
layout = "~/Views/Shared/_AdminLayout.cshtml";
}
else
{
layout = "~/Views/Shared/_Layout.cshtml";
}
Layout = layout;
}

Способ 2. Возвращение макета из ActionResult

Мы также можем переопределить рендеринг макета по умолчанию, возвращая макет из ActionResult, используя следующий код:

public ActionResult Index()
{
RegisterModel model = new RegisterModel();
//TO DO:
return View("Index", "_AdminLayout", model);
}

Метод 3: определение макета с каждым видом сверху

Мы также можем переопределить рендеринг макета по умолчанию, определив макет на представлении, используя следующий код:

@{
Layout = "~/Views/Shared/_AdminLayout.cshtml";
}

спасибо

1 голос
/ 11 апреля 2011

Как насчет этой перегрузки?

Метод Controller.View (String, String) (System.Web.Mvc)

в действии

  return View(viewName,"_X");

в действии b

  return View(viewName,"_Y";
0 голосов
/ 11 апреля 2011

Вы можете попробовать передать макет из действия контроллера: установите текущий макет в сеансе, а затем получите его в контроллере ошибок и передайте его представлению через свойство ViewBag:

public ActionResult A()
{
    // Do things

    // Set the layout
    Session["currentLayout"] = "~/Views/Shared/_X.cshtml";

    return View();
}

ErrorController:

public ActionResult NotFound() // 404
{
    // Set the layout
    ViewBag.ErrorLayout = Session["currentLayout"];

    return View();
}

тогда в вашем представлении об ошибке:

@{
    Layout = ViewBag.ErrorLayout;
}

Я предоставлю вам, что это не выиграет приз красоты;Могут быть и другие способы.

Например, посмотрите на этот ответ, как установить макет в ActionFilter: Как установить макет Razor в MVC с помощью фильтра атрибутов?

Вы можете написать свой собственный фильтр ошибок, унаследованный от HandleError, и установить там макет.

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