Возвращение общего представления об ошибках из области: как использовать обертку _Layout из области контроллера? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть BaseController с функцией просмотра ошибок, которая прекрасно работает:

public ViewResult ErrorView(string error, string errormessage)
{
    ViewBag.ErrorType = error;
    ViewBag.ErrorMessage = errormessage;
    return View("~/Views/Shared/Error.cshtml");
}

Расширение BaseController из моих обычных контроллеров и вызов этой функции работает как чудо.Он оборачивает представление в Views/Shared/_Layout.cshtml и все хорошо.

Однако, когда я вызываю эту функцию из контроллера, расширяющего базовый контроллер в области, он также оборачивает представление в Views/Shared/_Layout.cshtml вместо Areas/MyArea/Views/Shared/_Layout.cshtml

Как я могу изменить это поведение, не написав отдельной функции ErrorView для моей области?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Я нашел рабочее решение без дублирования кода

BaseController

    protected virtual string GetErrorPath()
    {
        return "~/Views/Shared/Error.cshtml";
    }

    public ViewResult ErrorView(string error, string errormessage)
    {
        ViewBag.ErrorType = error;
        ViewBag.ErrorMessage = errormessage;
        return View(GetErrorPath());
    }

Area_BaseController: BaseController

    override protected string GetErrorPath() {
        return "~/Areas/MyArea/Views/Shared/Area_Error.cshtml";
    }

Area_Error.cshtml (пустая оболочка)

@Html.Partial("Error")

0 голосов
/ 20 декабря 2018

Это проблема с областями.Так как я не уверен, что фреймворк может определить область, в которой вы находитесь, я бы предложил что-то вроде этого:

Добавьте AreaBaseController в вашу папку Area / Controllers, которая установит свойство, которое скажет это ведьма.

В вашем BaseController:

public string Area { get; set; }

public ViewResult ErrorView(string error, string errormessage)
{
    ViewBag.ErrorType = error;
    ViewBag.ErrorMessage = errormessage;
    return View($"~/{Area}/Views/Shared/Error.cshtml");
}

И в этом AreaBaseController:

public AreaBaseController()
{
    Area = "MyArea";
}

Вы можете изменить $ "~ / {Area} / part, если я этого не сделалпопробуйте, но он должен работать с небольшими изменениями.

Надеюсь, это поможет!

...