如何在 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.
我尝试不太成功地了解 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.