这是很基本的,但是成为获取MVC的绊脚石(当然来自Web Forms)!
如果a_Layout.cshtml
有一个可选的侧边栏作为Partial View,您如何让Controller传递ViewModel
给它(例如BlogPosts
),而不必将其包含在Controller的所有Page / View调用中?
我很高兴看到Controllers是我们需要构造模型的地方(不在Views内部,Partial或其他视图中),并且任何Partial View都将从其父级继承模型(方便)。但是有时父页面有自己的页面ViewModel
(例如SearchResults
)-尽管我可以通过将侧边栏传递BlogPosts
到每个视图中并仅添加该SearchResults
页面的来扭转它,但是仍然遇到相同的问题-如何有选择地传递潜在的和多重的分为父视图和部分视图。
因此,我们可以将任何其他Model放入中ViewBag
,然后将其放入任何Partials中,这也许是最好的解决方案,但看起来很混乱(并且不确定它们是否保持强类型)。还是使用额外的Partial View Controller的解决方案?在这种情况下,您如何执行此操作,因为在foreach
in上获得了一个空对象,_DefaultSideBar1.cshtml
并且调试显示additional _DefaultSideBar1()
根本没有运行(因此,不奇怪它的模型不会被注入):
当前示例路线HomeController.cs
:
[HttpGet]
public ActionResult SearchResults(string searchText)
{
ViewBag.Title = "Search Results";
List<WebResult> searchData = new List<WebResult>();
// generate searchData etc...
return View(searchData);
}
当前SearchResults.cshtml
(使用_Layout.cshtml
):
@model IEnumerable<Bing.WebResult>
// ... etc etc....
@section DefaultSidebar1
{
@Html.Partial("_DefaultSidebar1")
}
侧栏的预期附加电流控制器将加载但不会在控制器中被覆盖,因此对象参考为空:
[HttpGet]
public ActionResult _DefaultSideBar1()
{
return View(db.BlogPosts.ToList());
}
Current _DefaultSideBar1.cshtml
:
@model IEnumerable<Proj.MVC.SPQ.DataEntities.BlogPost>
<ul>
@foreach (var item in Model)
{
<li>@Html.ActionLink(item.Title, "Details", new { id=item.ID })</li>
}
</ul>
这个电话
@Html.Partial("_DefaultSidebar1")
使用指定的名称而不使用模型(或使用null
模型)来呈现视图。这就是为什么您获得空引用。如果要渲染它并提供一些模型,正确的调用方法是
@Html.Partial("_DefaultSidebar1", theModel)
当然,假设该模型在父视图中可用,很可能是父视图模型的一部分。
另一方面,如果您想通过执行某项操作的结果来呈现视图的一部分,则可以使用以下方法:
@Html.RenderAction("_DefaultSidebar1", "ControllerName")
当然ControllerName
这里是可选的。这将调用您的_DefaultSidebar1
动作,而不仅仅是查看,并呈现此动作产生的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句