在另一个视图中重用具有 MVC 参数 ASP.NET 视图

本文关键字:视图 MVC 参数 ASP NET 另一个 | 更新日期: 2023-09-27 18:34:28

作为MVC ASP.NET 新手,我已经看到了它在代码重用和可维护性方面的一些好处。在问之前关于路由的问题时,我对我的示例有另一个想法,但不确定如何实现它。

问:如何在单独的页面中重复使用问题视图和控制器,以及为某些内容设置参数(例如要显示多少问题(?

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

如何重用此问题代码?我看到我有部分视图的选项,但是当我实现它时,我不确定如何将任何代码路由到它。在 Web 窗体中,可以创建一个 ASP.net 控件,在代码隐藏中设置一些参数,然后将此控件嵌入到其他位置。

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

我的术语在这里可能并不完全正确。如果有的话,我正在尝试找到最好的(阅读MVC(方法来复制诸如 ASP.net Web 窗体用户控件之类的东西。例如,在"主"问题列表以及问题"小部件"上重用我的"问题"代码(HTML 和 C#(,如果您愿意的话,还可以在问题"小部件"上重用我的"问题"代码

在另一个视图中重用具有 MVC 参数 ASP.NET 视图

跳过在

视图中编写代码的诱惑,该视图自行访问数据。这包括使用像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);
}

然后,您可以在项目详细信息视图上重复使用相同的精确分部视图:

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

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

如果只想重用表示逻辑,则可以使用分部视图。如果还想重用控制器的逻辑,则必须将子操作与分部视图结合使用。

创建控制器

public class IssuesController : Controller
{
    [ChildActionOnly]
    public PartialViewResult List(string projectName, int issueCount = 0)
    {
        IEnumerable<Issue> issueList = new List<Issue>();
        // Here load appropriate issues into issueList
        return PartialView(issueList);
    }
}

不要忘记在"问题"文件夹中创建名为"列表"的适当分部视图。

最后在项目视图中使用此行

@{ Html.RenderAction("List", "Issues", new { projectName = "Px", issueCount = 10 } ); }

以及问题列表视图中的这一行

@{ Html.RenderAction("List", "Issues", new { projectName = "Px" } ); }

在你的控制器方法中,返回命名的视图,而不仅仅是 View((

即...

public ViewResult IssueView1()
{ return View("Issue");}
public ViewResult IssueView2()
{return View("Issue");}