我试图不太成功地了解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>
索引视图也使用@model IEnumerable,我实际上并不知道是否可以。模型本身包含Index和_TopItem视图所需的所有内容,只是为_TopItem视图返回一条记录,为Index视图返回许多记录。另外,在_service.GetTopArticle中运行的代码会执行一些仅与顶级文章记录相关的非查询内容。
我需要躺下来......及时学习这些东西。
答案 0 :(得分:0)
首先,关于从索引视图中调用子操作的问题:
您的精选部分目前正在调用@Html.Partial
,这意味着它会找到"_TopItem"
部分视图并将其渲染为当前视图中的html编码字符串(即您的索引视图)。
您指定尝试调用子操作TopArticle()
并在视图中呈现作为html字符串返回的部分视图。为此,您需要使用:
@section featured {
@Html.Action("TopArticle", "Home")
}
但是,我不相信这是你所需要的,因为你说你的索引视图模型包含索引和_TopItem局部视图的所有信息(见下文)。
有关详细信息,您应该进行谷歌搜索,了解视图,部分视图和子操作的差异。
要更正代码,我首先要确保_TopItem局部视图正确。我已经使用_TopItem局部视图识别了以下问题,其中一些问题超出了原始问题的范围:
模型作为NewPage的IEnumerable传入但是你的代码没有枚举几个新的页面对象,看起来应该只为一个NewPage模型创建html。因此,我认为模型声明应该是:
@model MySite.Models.NewPage
标记包含2个对style属性的引用,而不是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)
}
注意,正如您所说的索引模型包含要传递给_TopItem局部视图的信息,我假设索引模型包含一个名为TopArticle的属性,类型为NewPage。无论如何,您可以将模型传递给部分,但是通过调用@ Html.Partial可以找到合适的模型。如果您通过调用@ Html.Partial传递模型,那么您可能不需要ChildOnlyAction。