![](/img/trans.png)
[英]ASP.NET MVC 2 View with PartialView - PartialView Opens New Page
[英]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
上定義的擴展方法。 請注意,這有點棘手,因為我們需要的方法( 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");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.