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

时间:2010-04-02 18:08:35

标签: 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; }
    }

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

    }

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

#4(蓝框) - 显示即将举办的活动列表。使用dataContext.Model.Event作为ViewModel

方框#1,#2和#4将在整个网站上重复,它们是Master Page的一部分。所以,我的问题是:将这些数据从模型转移到控制器,最后转移到查看页面的最佳方法是什么?

  1. 我应该为谁制作一个控制器 将所有这些类包装在一起的母版页和ViewModel类
  2. 我应该为其创建部分视图 每一个盒子,每个 他们继承了适当的班级 (如果有可能的话 这样工作?)或
  3. 我应该把这个重复的代码放进去 所有控制器和所有附加 通过ViewData传输数据 可能是更糟糕的方式:)或者
  4. 可能有更好,更多 简单的方法,但我不知道/看到它?

  5. 提前致谢, ILE



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

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

2 个答案:

答案 0 :(得分:4)

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

  • 我不喜欢使用抽象类来获取数据到母版页。我更喜欢作文而不是继承。
  • 我不喜欢使用ViewData字典,因为它没有强类型。

我会为每个部分创建Views,ViewModel和Actions。然后拨打Html.RenderAction(...)例如:

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

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

然后在我的母版页中:

<% Html.RenderAction<CategoryController>(c => c.DisplayCategoreis()); %>

这将在Master Page中内联呈现CategoriesDisplay视图。这反过来又允许您拥有SOC(关注点分离),干净且易于管理的代码。

答案 1 :(得分:2)

我也与此斗争过。最初我做了大量的额外数据转储到ViewData中,最终不得不将其转换回来(做了一些缓解这一点的扩展,但仍然不是很好)。

我会选择#1并制作一个ViewModel来包装你需要的所有类。