【发布时间】:2023-04-01 02:05:01
【问题描述】:
我正在尝试使用名为 _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。我应该这样吗?还是有更好的办法?
【问题讨论】:
-
您可以像这样将模型传递给部分模型:@Html.Partial("viewName", Model)。问题是模型必须已经填充。
标签: asp.net asp.net-mvc asp.net-mvc-4