Asp.Net MVC 助手:创建一个全局助手,用于加载有或没有布局的视图

Asp.Net MVC Helper: create a global helper for loading view with or without layout

我想创建一个应用程序,其中如果有 Ajax 调用它 return 部分视图,如果它是页面刷新它 return 使用布局和呈现脚本。但问题是部分视图不会呈现部分,因为我在 APP_Code 中创建了一个 MVC 助手:

 @helper AddSection(Func<object, object> content)
 {
   if (IsAjaxRequest)
   {
        @content(null);
   }
   else
   {
        @section scripts {
            @content(null);
        }
   }
}

当我在我的视图中调用它时,出现以下错误:

CS0103: The name 'DefineSection' does not exist in the current context
Line 71: #line hidden
Line 72: DefineSection("scripts", () => {
Line 73: 

我试了很多方法还是报错,我也找了很多也没找到解决方法

您可以检查请求 header(如本 question 中所述)。检查 X-Requested-With,如果它显示 XMLHttpRequest 它应该是一个 XHR (Ajax) 请求。

在您的控制器中,您可以使用相同的方法 return PartialView

public ActionResult YourAction()
{
    Boolean IsAjax = false; //check the request header

    if (IsAjax) 
    {
        ViewBag.UseLayout = false;
        return PartialView("PartialView");
    }
    else
    {
        return View("View");
    }
}

在您的视图中,您可以阅读 ViewBag.UseLayout 并决定是否渲染包含所有部分的完整布局:

@{
    if (ViewBag.UseLayout == null || ViewBag.UseLayout) {
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    else {
        Layout = null;
    }
}

您可以将其扩展到 ViewStart.cshtml,对 ViewBag 进行空检查,以便将其应用于所有视图。

我查了很多,发现helper里面的section是不行的。下面是 link:

@helper 和@section 语法是编译页面的特殊指令。

一个 HelperResult(一个助手)不知道如何定义一个部分。

DefineSection 方法属于 WebPageBase。

您可能需要从不同的方向来解决这个问题。使用局部视图而不是助手可能会解决这个问题。

你可以使用嵌套布局..内部布局只是为了渲染正文和脚本。