5

我刚刚完成了我的第一个 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 将在整个网站上重复出现,它们是母版页的一部分。所以,我的问题是:将这些数据从模型传输到控制器并最终传输到视图页面的最佳方式是什么?

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


提前致谢, Ile



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

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

4

2 回答 2

4

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

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

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

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

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

然后在我的母版页中:

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

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

于 2010-04-02T21:41:54.107 回答
2

我也为此而战。最初,我将大量额外数据转储到 ViewData 中,最终不得不将其转回(做了一些扩展来缓解这种情况,但仍然不是很好)。

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

于 2010-04-02T18:13:37.327 回答