【问题标题】:asp.net mvc2 - controller for master page and code organizationasp.net mvc2 - 用于母版页和代码组织的控制器
【发布时间】:2010-04-02 18:08:34
【问题描述】:

我刚刚完成了我的第一个 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. 也许有更好的更多 简单的方法,但我不知道/看不到?


提前致谢, 伊莱



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

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

【问题讨论】:

  • 是否可以在 MVC 中制作强类型母版页?
  • 我也想知道这个问题的答案
  • 向母版页传递数据的答案在这里:asp.net/LEARN/mvc/tutorial-13-cs.aspx
  • 我会为每个部分创建视图、视图模型和操作。然后调用 Html.RenderAction(...)。
  • 现在我已经从上面的评论中阅读了这个解决方案,我认为这解决了我的问题。所以,我应该创建一个抽象控制器,将所有重复的数据放入其中,并让所有其他控制器都从它继承,以便该抽象类的所有数据在所有从它继承的控制器中都可用。

标签: asp.net-mvc code-organization


【解决方案1】:

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

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

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

我会创建CategoriesDisplay.aspx,只有红框的 html。我会通过你的CategoriesDisplay 模型。然后在我的控制器中:

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

然后在我的母版页中:

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

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

【讨论】:

  • 我可能应该补充一下,我使用的 Html.RenderAction 扩展是 Asp.Net MVC 期货程序集的一部分。 aspnet.codeplex.com/releases/view/41742
  • 我明白了...不知道这是什么 Html.RenderAction 所以我有点怀疑。这听起来绝对比具有抽象类的解决方案更有趣。我会在一两天内尝试一下,看看它是否真的对我有用 :) 谢谢 maxmissile!
  • 是否可以进行一个控制器操作并在不同的视图中使用它?更准确地说,是否可以在 Html.RenderAction() 内部定义 Controller,使用哪个 Action 和哪个 View?
  • 是的,可以从任何视图调用 RenderAction 并指向任何 Controller。
【解决方案2】:

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

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

【讨论】:

  • 我编辑了我的问题...我忘了补充一点,我不知道如何为母版页制作控制器(我是 asp.net 新手)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
相关资源
最近更新 更多