4

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

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

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

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

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

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

4

3 回答 3

4

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

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

于 2012-05-17T03:49:08.660 回答
3

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

创建控制器

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

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

最后在您的项目视图中使用这一行

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

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

@{ Html.RenderAction("List", "Issues", new { projectName = "Px" } ); }
于 2012-05-16T21:44:05.017 回答
0

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

IE...

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

public ViewResult IssueView2()
{return View("Issue");}
于 2012-05-16T20:04:10.837 回答