Одно из решений - создать подкласс 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");
}
}