跳过在视图中编写代码并自行访问数据的诱惑。这包括使用 RenderAction 等内置函数。即使 RenderAction “返回”以执行另一个控制器,但这并不意味着视图没有自行执行操作,这可以说打破了 MVC 方法,其中视图应该什么都不做,而模型应该包含所有查看需求。
相反,您可以做的是为您的问题列表页面发回一个模型,其中包含一个包含问题列表的属性:
public class IssueListModel {
public List<Issue> Issues { get; set; }
}
将其填充到您的问题列表操作中:
public ActionResult IssueList(string projectName) // projectName may be null
{
var issueListModel = new IssueListModel();
issueListModel.Issues = SomeRepository.GetIssues(projectName); // whatever you need to send...
return View(issueListModel);
}
然后在您的列表页面上,您可以循环浏览它:
@foreach (var issue in Model.Issues) {
<div>@issue.IssueName</div>
}
或者您可以将问题集合发送到局部视图:
@Html.RenderPartial("IssueList", Model.Issues)
您可以键入部分视图以期望 List 作为模型:
@model List<MyProject.Models.Issue>
...然后在局部视图中循环遍历它,这一次对模型本身进行 foreach:
@foreach (var issue in Model) {
<div>@issue.IssueName</div>
}
然后您可以做的是为您的项目详细信息视图创建一个单独的模型,该模型还包含一个包含问题的属性:
public class ProjectDetailModel {
public Project Project { get; set; }
public List<Issue> Issues { get; set; }
public string Whatever { get; set; }
}
在控制器中,您可以使用您在列表控制器中填充的相同功能来填充此列表:
public ActionResult ProjectDetail(string projectName)
{
var projectDetailModel = new ProjectDetailModel();
projectDetailModel.Issues = SomeRepository.GetIssues(projectName, 10); // whatever you need to send
return View(projectDetailModel);
}
然后,您可以在 ProjectDetail 视图上重新使用相同的部分视图:
@Html.RenderPartial("IssueList", Model.Issues)
一个很长的答案,但我希望这就是你要找的!