使用ASP.NET MVC中的参数重用另一个视图中的视图

时间:2012-05-16 19:58:23

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

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

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

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

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

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

我的术语在这里可能不完全正确。如果有的话,我试图找到最好的(读取MVC)方式来复制像ASP.net Web Forms User Controls这样的东西。就像在'主'问题列表中重用我的'问题'代码(HTML和C#),以及如果你将

问题'小部件'

3 个答案:

答案 0 :(得分:3)

在视图中跳过诱惑写入代码,并自行访问数据。这包括使用像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)

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

答案 1 :(得分:2)

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

创建一个控制器

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

不要忘记在文件夹中创建名为List的适当部分视图。

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

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

并在问题列表视图中显示此行

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

答案 2 :(得分:0)

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

即...

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

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