我试图了解MVC并不是很成功。我的家庭控制器包含一个Index方法,它运行正常,到目前为止还不错,但我不知道如何调用ChildAction方法home/TopArticle
行动方法
[ChildActionOnly]
public ActionResult TopArticle()
{
return PartialView(_service.GetTopArticle());
}
在我的索引视图中,我有标记:
@section featured {
@Html.Partial("_TopItem")
}
_TopItem视图
@model IEnumerable<MySite.Models.NewPage>
<section class="featured">
<div id="TopItem">
<div id="TopItemImg">
<a href="http://www.mysite.co.uk/">
<img style="border: 1px solid lightgray" width="320" height="233" style="border:1px solid lightgray;" alt="Model.Title" src="/Img/Model.TopItemImage">
</a>
</div>
<div id="TopContent">
<h2><a href="/Home/TopItem/Model.Id/Model.Title"></a></h2>
<div class="dt">
<div class="dl">
@Html.Label(Model.DatePublished.ToString())
@Html.Label(@Html.Action("TopArticle", "Home", new { // am lost at this point}))
</div>
<div class="tl">
@Html.Label(Model.InfoTags ?? "")
</div>
</div>
</div>
</div>
</section>
Index视图也使用@model IEnumerable,我实际上不知道这是否可以。模型本身包含Index和_TopItem视图所需的一切,只是会有一条记录返回给_TopItem,而有许多记录返回给Index视图。此外,运行在_service.GetTopArticle中的代码会执行一些仅与顶部文章记录相关的非查询内容。
我需要躺下。。。还有时间好好学习这些东西。
首先,关于从索引视图调用子动作的问题:
您的特色部分当前正在调用@Html.Partial
,这意味着它将找到"_TopItem"
部分视图,并在当前视图(即索引视图)中将其呈现为html编码的字符串。
您指定要尝试调用子操作TopArticle()
,并在视图中呈现作为html字符串返回的部分视图。要做到这一点,你需要使用:
@section featured {
@Html.Action("TopArticle", "Home")
}
但是,我不认为这是您所需要的,因为您说过,您的Index视图模型包含Index和_TopItem部分视图的所有信息(请稍后参阅)。
要了解更多信息,你应该在谷歌上搜索视图、局部视图和子动作的差异。
要更正代码,我首先要确保_TopItem部分视图是正确的。我在_TopItem部分视图中发现了以下问题,其中一些问题超出了原始问题的范围:
该模型作为NewPage的IEnumerable传入,但您的代码没有枚举多个新页面对象,看起来它应该只为单个NewPage模型创建html。因此,我认为模型声明应该是:
@model MySite.Models.NewPage
该标记包含对样式属性的2个引用,而不是1个。
标记包含
alt="Model.Title"
的alt属性,这意味着alt="Model.Title"
将直接写为html,我希望alt="@Model.Title"
在alt属性中呈现模型的内容。类似地,标签包含
src="/Img/Model.TopItemImage"
,我认为这应该是src="/Img/@Model.TopItemImage"
所有标签标签似乎都不正确。例如,
@Html.Label(Model.DatePublished.ToString())
-Model.DatePublished.ToString()
将返回一个字符串,然后将尝试在模型上找到该字符串,并且由于该字段名称不存在而出错。因此,您可能想要编写:@Html.Label("DatePublished")
或@Html.Label(m => m.DatePublished)
。对于第二个标签,我不确定你想要实现什么,但你可能想查找合适的文章。
一旦您有了正确的_TopActicle部分视图,您就可以返回到索引视图直接渲染部分:
@section featured {
@Html.Partial("_TopItem", Model.TopArticle)
}
请注意,正如您所说的,您的Index模型包含要传递到_TopItem部分视图的信息,我假设Index模型包含一个名为TopArticle的NewPage类型的属性。无论如何,您可以通过对@Html.partial的调用将模型传递到分部中,但您认为合适。如果您通过对@Html.partial调用传递模型,则可能不需要ChildOnlyAction。