2

我想创建一个应用程序,如果有 Ajax 调用它返回部分视图,如果它是页面刷新它返回布局和渲染脚本。但问题是部分视图不会呈现部分,因为我在 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: 

我尝试了很多东西,但这个错误仍然存​​在,我也搜索了很多但找不到解决方案。

4

2 回答 2

2

我搜索了很多,发现 helper 里面的那个部分是不可能的。以下是链接:

https://stackoverflow.com/a/22977735/5179246

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

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

DefineSection方法属于 WebPageBase 。

你可能不得不从不同的方向来解决这个问题。使用部分视图而不是助手可能会解决这个问题。

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

于 2017-03-27T18:31:41.277 回答
0

您可以检查请求标头(如本问题中所述)。检查X-Requested-With,如果它说它XMLHttpRequest应该是一个 XHR (Ajax) 请求。

在您的控制器中,您可以PartialView以相同的方法返回 a 。

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 进行空检查,以便将其应用于所有视图。

于 2017-03-27T07:11:27.433 回答