簡體   English   中英

如何根據 Asp.net MVC 中的請求簡化 View 或 PartialView 的返回

[英]How to simplify the return of a View or a PartialView depending on the request in Asp.net MVC

目前我的很多動作都有這種類型的代碼

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

我想將它們簡化為:

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

一種解決方案是子類Controller並在那里添加您的特殊方法:

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

然后,您將修改現有控制器以改為從新基 class 繼承,從而允許您調用新方法:

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

由於(根據您的評論)您不喜歡子類路由,因此替代方法是在Controller上定義的擴展方法。 請注意,這有點棘手,因為我們需要的方法( ViewPartialView )是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");
    } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM