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

How to get values returned by child action method in mvc 5 partial view

我尝试不太成功地了解 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() 并在视图中将部分视图 return 编辑为 html 字符串。为此,您需要使用:

@section featured {
    @Html.Action("TopArticle", "Home")
}

但是,我认为这不是您所需要的,因为您说过您的 Index 视图模型包含 Index 和 _TopItem 部分视图的所有信息(见下文)。

有关更多信息,您应该google 搜索有关视图、部分视图和子操作的差异。

要更正代码,我首先要确保 _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() 将 return 一个字符串,然后将尝试在模型上找到该字符串,并且会因为该字段名称不存在而出错。因此,您可能想写:@Html.Label("DatePublished")@Html.Label(m => m.DatePublished)。对于第二个标签,我不确定您想要达到什么目的,但您可能需要查找相应的文章。

一旦您拥有更正的 _TopActicle 局部视图,您就可以 return 到您的索引视图以直接呈现局部视图:

@section featured {
    @Html.Partial("_TopItem", Model.TopArticle)
}

请注意,正如您所说,您的 Index 模型包含要传递给 _TopItem 局部视图的信息,我假设 Index 模型包含一个名为 TopArticle 的 NewPage 类型的 属性。无论如何,您可以通过调用 @Html.Partial 将模型传递到部分,但是您认为合适。如果您通过对 @Html.Partial 的调用传递模型,那么您可能不需要 ChildOnlyAction.