Asp.net mvc4布局

时间:2016-04-12 18:53:29

标签: asp.net asp.net-mvc asp.net-mvc-4

我正在尝试使用名为_Menus的部分视图在我的_Layout页面中创建菜单,该部分视图从我服务器上的Json文件中读取。但我无法弄清楚如何使用布局页面中的模型调用局部视图。

这是_Menu.cshtml页面,它位于Shared文件夹中:

@model IEnumerable<LangSite_151209.Models.MenuItem>

<div id="menu" class="largescreen_show smallscreen_hide" data-display="flex">
    <div id="menu_left" class="menu_item">

        @foreach (var mainMenuItem in Model)
        {
           // A bunch of stuff with the model that draws the menu
        }
   </div>
</div>

以下是我在_Layout页面中调用它的方式:

<!DOCTYPE html>

<html lang="en">
<head>
     <!-- Meta and script stuff -->
</head>
<body style="overflow:hidden;"> 


    <div id="fg">

        <div id="mobile_wrapper">
        @Html.Partial("../Shared/_Menu")
        </div>

    </div>
    <!-- A bunch of footer stuff that's irrelevant here -->
</html>

我尝试使用SharedController返回部分视图,该部分视图打开Json文件并将其转换为部分模型,如下所示:

public class SharedController : Controller
{
    // GET: Shared
    [ChildActionOnly]
    public ActionResult _Menu()
    {
        string filePath = HostingEnvironment.MapPath(@"~/App_Data/MenuItems.json");
        StreamReader sr = new StreamReader(filePath);

        string JsonString = sr.ReadToEnd();
        JsonSerializerSettings settings = new JsonSerializerSettings
        {
            TypeNameHandling = TypeNameHandling.All
        };
        var menuItems = JsonConvert.DeserializeObject<List<MenuItem>>(JsonString, settings);

        return View(menuItems.ToList());
    }       
}

但是当我尝试这个时,我在模型上得到一个NullReferenceException:“对象引用未设置为对象的实例。”显然你不能以某种方式传递模型。我知道读取Json对象的代码是有效的,因为当我在常规(非局部)页面上使用相同的代码时,它会正确地传递模型并且脚本会绘制菜单。

通常,如果我想将模型传递给部分模型,我只需将模型放在主页面中并以此方式传递。但我不知道如何在_Layout中放置一个模型。这是我应该怎么做的?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

@Html.Partial("../Shared/_Menu")行不会执行您的_Menu操作方法。您的_Menu.cshtml局部视图强烈输入MenuItem列表。因此,您在调用Html.Partial方法时应该explicitly pass,或者您的主视图(调用此部分)也应该键入同一个集合。

您应该使用Html.Action方法而不是Html.Partial

@Html.Action("_Menu", "Shared")

这将执行_Menu操作方法,并将所需数据(MenuItem列表)传递到相应的部分视图。