【问题标题】:Asp.Net MVC Helper: create a global helper for loading view with or without layoutAsp.Net MVC Helper:创建一个全局帮助器,用于加载有或没有布局的视图
【发布时间】:2017-03-27 06:52:48
【问题描述】:

我想创建一个应用程序,如果有 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: 

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

【问题讨论】:

  • 为了清楚起见,您想调用两次相同的操作。一次使用标准 get 请求,一次使用 xhr ajax 请求?
  • 是的,正是……

标签: asp.net-mvc asp.net-mvc-4 razor html-helper razorgenerator


【解决方案1】:

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

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

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

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

DefineSection 方法属于 WebPageBase。

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

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

【讨论】:

    【解决方案2】:

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

    在您的控制器中,您可以使用相同的方法返回 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 进行 null 检查,以便将其应用于所有视图。

    【讨论】:

    • 我已经知道是否加载部分视图,问题是如果是部分我想加载脚本部分而不渲染部分,如果是全视图部分应该渲染。
    • 我不认为它会通过ajax调用直接从服务器加载部分视图......
    • 您将不得不回到视图(ajax 响应),然后从视图中相应地加载部分视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2017-09-28
    • 2016-02-24
    • 2011-01-07
    相关资源
    最近更新 更多