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

Asp.net mvc 5 如何在MVC5局部视图中获取子操作方法返回的值,asp.net-mvc-5,Asp.net Mvc 5,我试图不太成功地让我的头围绕MVC。My home controller包含一个运行正常的索引方法,但我不知道如何调用ChildAction方法home/TopArticle 行动方法 [ChildActionOnly] public ActionResult TopArticle() { return PartialView(_service.GetTopArticle()); } 在我的索引视图中,我有以下标记: @section featured { @Html.Part

我试图不太成功地让我的头围绕MVC。My home controller包含一个运行正常的索引方法,但我不知道如何调用ChildAction方法home/TopArticle

行动方法

[ChildActionOnly]
public ActionResult TopArticle()
{
    return PartialView(_service.GetTopArticle());
}
在我的索引视图中,我有以下标记:

@section featured {
    @Html.Partial("_TopItem")
}
\u 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
@Label(Model.DatePublished.ToString())
@Label(@Html.Action(“TopArticle”,“Home”,new{//am lost at this point}))
@Html.Label(Model.InfoTags???)
索引视图也使用@model IEnumerable,我不知道这是否正确。模型本身包含索引和_TopItem视图所需的所有内容,只是_TopItem视图将返回一条记录,而索引视图将返回多条记录。另外,在_service.GetTopArticle中运行的代码执行一些仅与顶级文章记录相关的非查询内容


我需要躺下。。。是时候好好学习这些东西了。

首先,关于从索引视图调用子操作的问题:

您的特色部分当前正在调用
@Html.Partial
,这意味着它将找到
“\u TopItem”
部分视图,并在当前视图(即您的索引视图)中将其呈现为Html编码的字符串

您指定尝试调用子操作
TopArticle()
,并在视图中呈现作为html字符串返回的部分视图。为此,您需要使用:

@section featured {
    @Html.Action("TopArticle", "Home")
}
但是,我不认为这是您真正需要的,因为您说过您的索引视图模型包含索引和_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)
}

注意,正如您所说的,您的索引模型包含要传递到_TopItem部分视图的信息,我假设索引模型包含一个名为TopArticle的属性,类型为NewPage。不管怎样,您都可以通过调用@Html.partial将模型传递到partial中。如果您通过呼叫@Html.Partial传递模型,则您可能不需要ChildOnlyAction。

感谢您如此详尽的回答,很抱歉延迟回复。