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

时间:2015-02-13 14:12:21

标签: asp.net-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>

索引视图也使用@model IEnumerable,我实际上并不知道是否可以。模型本身包含Index和_TopItem视图所需的所有内容,只是为_TopItem视图返回一条记录,为Index视图返回许多记录。另外,在_service.GetTopArticle中运行的代码会执行一些仅与顶级文章记录相关的非查询内容。

我需要躺下来......及时学习这些东西。

1 个答案:

答案 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。