c# - 在 ASP.NET MVC 中使用参数在另一个 View 中重用一个 View

标签 c# asp.net-mvc asp.net-mvc-3

作为 ASP.NET MVC 的新手,我已经看到它在代码重用和可维护性方面的一些好处。当询问 previous question on routing ,我对我的示例有另一个想法,但不确定如何实现它。

问题:如何在单独的页面中重用我的问题 View 和 Controller ,以及如何为某些事情设置参数(例如要显示多少问题)?

示例: 在我的网络应用程序中假设我想显示问题列表。这些问题按项目分组。因此,如果您访问 www.example.com/projectname/issues,您将看到该项目的问题列表,如果您访问 www.example.com/issues,您将看到所有项目的所有问题。我想做的是,如果您访问 www.example.com/projectname,您会看到有关该项目的一些信息,包括提交的最后 10 个问题。

如何重用这个问题代码?我看到我有部分 View 的选项,但是当我实现它时,我不确定如何将任何代码路由到它。在 Web Forms 中,您可以制作一个 ASP.net 控件,在后面的代码中设置一些参数,然后将此控件嵌入到其他地方。

到目前为止,我发现的一些示例要么缺乏完整的实现(不仅仅是在其他页面中添加一些 HTMl),要么看起来像旧的 MVC 代码,但在 ASP.NET MVC 3 中似乎对我不起作用,并且不允许我设置参数并展示这种类型的重用。

我的术语在这里可能不完全正确。如果有的话,我正试图找到最好的(阅读 MVC)方法来复制像 ASP.net Web Forms User Controls 这样的东西。 .就像在“主”问题列表和问题“小部件”上重复使用我的“问题”代码(HTML 和 C#)

最佳答案

跳过在自行访问数据的 View 中编写代码的诱惑。这包括使用 RenderAction 等内置函数。尽管 RenderAction“返回”执行另一个 Controller ,但这并不意味着 View 没有自行执行操作,这可以说打破了 MVC 方法,在 MVC 方法中, View 应该什么都不做,而模型应该包含 View 所需的一切

您可以做的是发回问题列表页面的模型,其中包含包含问题列表的属性:

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>
}

或者您可以将 Issues 集合向下发送到部分 View :

@Html.RenderPartial("IssueList", Model.Issues)

您可以键入分部 View 以期望 List 作为模型:

@model List<MyProject.Models.Issue>

...然后在局部 View 中循环遍历它,这次对模型本身进行 foreach:

@foreach (var issue in Model) {
    <div>@issue.IssueName</div>
}

然后你可以做的是为你的项目细节 View 制作一个单独的模型,它还包含一个包含问题的属性:

public class ProjectDetailModel {
    public Project Project { get; set; }
    public List<Issue> Issues { get; set; }
    public string Whatever { get; set; }
}

在 Controller 中,您可以使用在列表 Controller 中填充的相同函数来填充此列表:

public ActionResult ProjectDetail(string projectName)
{
    var projectDetailModel = new ProjectDetailModel();

    projectDetailModel.Issues = SomeRepository.GetIssues(projectName, 10); // whatever you need to send


    return View(projectDetailModel);
}

然后您可以在 ProjectDetail View 上重新使用完全相同的部分 View :

@Html.RenderPartial("IssueList", Model.Issues)

答案很长,但我希望这就是您要找的!

关于c# - 在 ASP.NET MVC 中使用参数在另一个 View 中重用一个 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10625789/

相关文章:

c# - 将预处理层添加到 ANTLR4 而不删除 token 的偏移量

asp.net-mvc - POST 后重定向不会更改 URL

c# - 如何在图表上设置系列颜色?

javascript - MVC JavaScript的window.open添加到url

c# - 将日期时间从 javascript 传递给 c# (Controller)

c# - 界面无法更新

c# - 如何在 Xamarin android 中更改操作栏标题颜色

c# - .NET Ping() 给出错误超时?

c# - 如何将 asp.net webform 和 mvc 4 应用程序迁移到 AngularJS 站点

asp.net-mvc - 服务是否应该始终返回 DTO,还是也可以返回域模型?