Как упростить возврат View или PartialView в зависимости от запроса в Asp. net MVC - PullRequest
1 голос
/ 05 мая 2020

В настоящее время многие мои действия имеют этот тип кода

    public ActionResult MyAction() {
        if (Request.IsAjaxRequest()) {
            return PartialView();
        }
        return View();
    }

Я хотел бы упростить их примерно до:

    public ActionResult MyAction() {
        return ViewOrPartialView();
    }

1 Ответ

1 голос
/ 05 мая 2020

Одно из решений - создать подкласс Controller и добавить туда свой специальный метод:

public class MyControllerBase : Controller
{
    protected ActionResult ViewOrPartialView()
    {
        if (Request.IsAjaxRequest()) 
           return PartialView();
        return View();
    } 
}

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

public class YourController : MyControllerBase
{
    public ActionResult MyAction()
    {
        return ViewOrPartialView() 
    } 
}

Поскольку (на основе ваших комментариев) вам не нравится маршрут подкласса, альтернативой может быть метод расширения, определенный в Controller. Обратите внимание, что это становится немного сложнее, поскольку нам нужны методы (View и PartialView): protected (технически protected internal). С небольшой помощью MVC исходного кода кода мы можем переопределить функциональность самостоятельно:

public static class ControllerExtensions
{
    public static ActionResult ViewOrPartialView(
        this Controller controller,
        object model = null,
        string viewName = null)
    {

       if (controller == null) 
          throw new ArgumentNullException(nameof(controller));

       var vd = controller.ViewData;
       var td = controller.TempData;
       var vec = controller.ViewEngineCollection;

       if (model != null)
       {
           vd.Model = model;
       } 

       if (controller.Request.IsAjaxRequest())
       {
            return new PartialViewResult
            {
                 ViewName = viewName, 
                 ViewData = vd,
                 TempData = td,
                 ViewEngineCollection = vec
            };
       } 

       return new ViewResult
       {
             ViewName = viewName, 
             ViewData = vd,
             TempData = td,
             ViewEngineCollection = vec
        };

    } 
}

Затем мы можем вызывать их как методы расширения. Обратите внимание на this, которое становится обязательным:

public class YourController : Controller
{
    public ActionResult MyAction()
    {
        return this.ViewOrPartialView();
    }

    public ActionResult MyActionWithModel()
    {
        var model = GetSomeModel();
        return this.ViewOrPartialView(model);
    }

    public ActionResult MyActionWithViewName()
    {
        return this.ViewOrPartialView(viewName: "CustomView");
    }

    public ActionResult MyActionWithModelAndViewName()
    {
        var model = GetSomeModel();
        return this.ViewOrPartialView(model, "CustomView");
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...