11

我正在为 asp.net MVC 布局页面设置共享内容(导航)。

这是我的部分视图“_LayoutPartial.cshtml”,其中包含从模型中提取导航数据的代码。

@model MyApp.Models.ViewModel.LayoutViewModel
<p>

    @foreach (var item in Model.navHeader)
    {
        //Test dump of navigation data
        @Html.Encode(item.Name); 
        @Html.Encode(item.URL); 

    }
</p>

这是我的控制器“LayoutController.cs”的代码的样子。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MyApp.Models.ViewModel;

namespace MyApp.Controllers
{
    public class LayoutController : Controller
    {

        //
        // GET: /Layout/

        LayoutViewModel layout = new LayoutViewModel();

        public ActionResult Index()
        {
            return View(layout);
        }

    }
}

这是“_Layout.cshtml”页面的代码。我正在尝试使用 Html.RenderAction(Action,Controller) 方法在这里调用局部视图。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <p>
        @{Html.RenderAction("Index","Layout");}
    </p>

    @RenderBody()
</body>
</html>

当布局页面执行@{Html.RenderAction("Index","Layout");} 行时,它会抛出错误消息“Error execution child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'”。

我缺少什么朋友?如何在布局页面中调用局部视图?

谢谢大家!

4

4 回答 4

18

代替:

public ActionResult Index()
{
    return View(layout);
}

做:

public ActionResult Index()
{
    return PartialView(layout);
}

如果您在从子操作返回普通视图时不这样做,则此普通视图会尝试包含布局,这反过来会尝试呈现子操作,而子操作又会返回一个视图,该视图又包含布局,这反过来又试图呈现子动作,......我们最终得到的名字就像这个网站移植的名字一样。

同样在您的部分中,您不需要进行双重编码。@Razor 函数已经进行了 HTML 编码:

@model MyApp.Models.ViewModel.LayoutViewModel
<p>

    @foreach (var item in Model.navHeader)
    {
        @item.Name 
        @item.URL
    }
</p>
于 2012-07-12T19:42:30.280 回答
6

首先验证您的子视图是否在Shared目录中

@Html.Partial("_LayoutPartial")

或者

 @{Html.RenderAction("actionname", "controller name");}

并且不要使用@Html.Encode(),Razor 已经在为你做。只需使用

@item.Name 
@item.URL
于 2012-07-12T19:43:33.190 回答
2

我已经解决了进入布局页面的这个错误

System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper

重要的 !首先在共享文件夹中创建局部视图

在控制器中,

public PartialViewResult Userdetails()
{
   ....
   return PartialView("PartialViewName", obj);  
}

在布局页面中,

@{Html.RenderAction("action","controller");}
于 2016-05-13T11:34:21.690 回答
0

我知道这是一个老问题,但我想我会把它扔在这里。您可以使用Html.ActionHtml.RenderAction。它们在技术上都做同样的事情,但取决于您返回的内容量可能会影响您应该真正使用哪个内容以获得最佳效率。

这两种方法都允许您从视图调用操作方法并在视图中输出操作的结果。两者之间的区别在于,Html.RenderAction将结果直接呈现给响应(如果操作返回大量 HTML,则效率更高),而Html.Action返回带有结果的字符串。

来源

于 2016-11-22T17:59:23.947 回答