asp.net mvc2 - 主页和代码组织的控制器

ili*_*ica 5 asp.net-mvc code-organization

我刚刚完成了我的第一个ASP.NET MVC(2)CMS.下一步是构建将显示CMS数据库中数据的网站.这是网站设计:

http://img56.imageshack.us/img56/4676/portal.gif http://img56.imageshack.us/img56/4676/portal.gif


#1(红框) - 显示文章类别.视图模型:

public class CategoriesDisplay
    {
        public CategoriesDisplay() { }

        public int CategoryID { set; get; }
        public string CategoryTitle { set; get; }
    }
Run Code Online (Sandbox Code Playgroud)

#2(布朗框) - 显示最后x篇文章; 从绿箱#3中跳过那些.视图模型:

public class ArticleDisplay
    {
        public ArticleDisplay() { }

        public int CategoryID { set; get; }
        public string CategoryTitle { set; get; }

        public int ArticleID { set; get; }

        public string ArticleTitle { set; get; }
        public string URLArticleTitle { set; get; }
        public DateTime ArticleDate;

        public string ArticleContent { set; get; }

    }
Run Code Online (Sandbox Code Playgroud)

#3(绿色框) - 显示最后x篇文章.使用与棕色框#2相同的ViewModel

#4(蓝色框) - 显示即将发生的事件列表.用途dataContext.Model.Event为视图模型

方框#1,#2和#4将在整个网站上重复,它们是Master Page的一部分.所以,我的问题是:将这些数据从Model转移到Controller并最终转移到View页面的最佳方法是什么?

  1. 我应该为主页和ViewModel类创建一个控制器,将所有这些类包装在一起OR
  2. 我是否应该为每个这些框创建部分视图,并使每个框都继承适当的类(如果它甚至可能以这种方式工作?)或者
  3. 我应该把这个重复的代码放在所有控制器中,并通过ViewData传输所有额外的数据,这可能是更糟糕的方式:) OR
  4. 可能有更好更简单的方法,但我不知道/看到它?


谢谢,Ile



编辑:
如果您的答案是#1,那么请解释如何为母版页制作控制器!

编辑2:
在本教程中描述了如何使用抽象类将数据传递到母版页:http://www.asp.net/LEARN/mvc/tutorial-13-cs.aspx
在"清单5 - Controllers\MoviesController.cs"中",使用LINQ直接从数据库检索数据,而不是从存储库中检索数据.所以,我想知道这是否只是在本教程中,或者这里有一些技巧,存储库不能/不应该使用?

mxm*_*ile 4

要将数据获取到我的母版页:

  • 我不喜欢使用抽象类将数据获取到母版页。与继承相比,我更喜欢组合。
  • 我不喜欢使用 ViewData 字典,因为它不是强类型的。

我将为每个部分创建视图、视图模型和操作。然后调用Html.RenderAction(...)例如:

CategoriesDisplay.aspx我将仅使用 redbox 的 html创建。我会通过你的CategoriesDisplay模型。然后在我的控制器中:

public class CategoryController : Controller
{
    public ActionResult DisplayCategories()
    {
      var model = new CategoriesDisplay();
      ...
      return View(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的母版页中:

<% Html.RenderAction<CategoryController>(c => c.DisplayCategoreis()); %>
Run Code Online (Sandbox Code Playgroud)

这将在母版页中内嵌显示类别显示视图。这反过来又允许您拥有 SOC(关注点分离)、干净且可管理的代码。