我试图学习如何使用部分视图。我做了一个简单的示例应用程序,我需要帮助填补以便能够理解(并且还了解部分视图的重点)并将所有部分粘合在一起以便能够运行这个简单的测试应用程序。我已经阅读了一些关于部分视图的例子,但我不明白!
应用程序只显示使用Entity Framework创建的数据库中的First Name
和Last Name
列表。
感谢我能得到一些帮助!
模型人员看起来像这样:
namespace RenderActionTest.Models
{
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
部分视图如下所示:
@model RenderActionTest.Models.Person
<tr>
<td>
@Html.DisplayFor(modelItem => Model.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => Model.LastName)
</td>
</tr>
索引视图如下所示:
@model IEnumerable<RenderActionTest.Models.Person>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.FirstName)
</th>
<th>
@Html.DisplayNameFor(model => model.LastName)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
@{
Html.RenderAction(" ?? ", " ?? ");
}
}
</table>
最后控制器看起来像这样:
// GET: Persons
public ActionResult Index()
{
var person = new Person();
// return View(db.People.ToList());
return PartialView(" ?? ", person);
}
答案 0 :(得分:1)
从您给出的示例代码中继续:
<link rel>
将Partials视为HTML代码段(如.ascx)并需要嵌入到您的视图中。在Razor视图引擎中,有四种方法可以在父视图中呈现partials / Actions。
@foreach (var item in Model) {
@{
Html.RenderAction(" ?? ", " ?? ");
}
}
当您要将模型发送到视图时使用RenderPartial,并且会有很多html不需要存储在变量中。 @{Html.RenderPartial("~/Views/Controller/_Partial.cshtml", item);} // from your example
返回.ascx用户控件的等效项。它获得了自己的页面ViewDataDictionary副本,对RenderPartial的ViewData所做的更改不会影响父级的ViewData。
@Html.RenderPartial
与@Html.Partial("~/Views/Controller/_Partial.cshtml", item) // from your example
方法类似,当部分视图中的显示数据已经存在于相应的视图模型中时,部分方法也很有用。
RenderPartial
返回一个html编码的字符串,该字符串与父节点内联构造。它访问父模型。
@Html.Partial
当您没有要发送到视图的模型并且需要将一些文本带回来需要存储在变量中时,请使用Action。
@{Html.Action("ActionReturningPartialView","ControllerWhereActionResides");}
当您没有要发送到视图的模型时,请使用@{Html.RenderAction("ActionReturningPartialView","ControllerWhereActionResides");}
,并且需要将大量html带回来,而不需要将其存储在变量中。
RenderAction
和RenderAction
更快。
希望上面的细节可以帮助您确定何时需要一个动作方法,何时只需渲染部分而不需要Action方法。
答案 1 :(得分:0)
关于你的控制器:
PartialView()
期望将部分视图的位置作为第一个参数,因此它会像
PartialView("~/Views/Shared/_MyPartialView.cshtml", ...)
关于列表视图:
Html.RenderAction()
不是您正在搜索的正确扩展方法,因为它是用于呈现指向控制器中的操作的链接。您要搜索的是Html.RenderPartial("PersonPartialView", person)
。
答案 2 :(得分:0)
你可以打电话
Html.RenderPartial("~/Views/Shared/PartialViewName.cshtml",item);
或者
@Html.Partial("~/Views/Shared/PartialViewName.cshtml",item);
而不是调用渲染动作。
在您的示例中,您并不真正使用部分视图,因此您也可以在索引中return View("~/Views/Shared/PartialViewName.cshtml",person)
。
如果您仍想使用renderAction,则需要将其称为“Html.RenderAction("Index", "ControllerName");