如何在mvc 5局部视图中获取子动作方法返回的值



我试图了解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。

最新更新