asp.net MVC - 复杂的例子?

时间:2009-10-01 13:46:39

标签: asp.net-mvc views

我们正在评估asp.net MVC,并且正在寻找NerdDinner之外的一些更复杂的例子。

具体来说,在一个更复杂的网络应用程序中,我可能有一个导航栏(包括主导航,搜索框和登录状态显示),主内容区域,子内容区域(包括相关内容)和一个页脚。在MVC中,控制器返回一个ViewModel(如果我认为我想从我的视图中取消我的Controller,则不是视图) - 我的ViewModel是否必须具有覆盖“页面”的每个方面的属性旨在呈现为输出?

如果不清楚,我可以重新提出我的问题。

顺便说一句 - 我知道这个网站是使用MVC构建的。我是可下载的例子。

提前致谢。

7 个答案:

答案 0 :(得分:6)

看看CodeCampServer

编辑:参考您对视图模型的查询,这不是完美的答案,但我想我会引起对AutoMapper(CodeCampServer使用)的注意,协助模型和视图模型之间的自动映射数据,这是一个实时节省。还值得考虑输入构建器的概念(有一些MVCContribASP.NET MVC 2中的一些),这也将通过封装板上的通用功能来减少必须传递到视图中的数据量

这里有一个关于ASP.NET MVC 2产品的好视频:http://channel9.msdn.com/posts/Glucose/Hanselminutes-on-9-ASPNET-MVC-2-Preview-1-with-Phil-Haack-and-Virtual-Scott/

答案 1 :(得分:3)

这里你去:

<% Html.RenderAction<LayoutController>(c => c.SearchBox()); %>
<% Html.RenderAction<LayoutController>(c => c.NavBox(Model)); %>

将这些内容放在您的主页或侧栏小部件的特定视图中,并将其逻辑从您正在处理的控制器/视图模型中抽象出来。他们甚至可以读取当前的RouteData(url / action)和ControllerContext(参数/模型),因为你正在处理这些对象中的环境值 - 并执行完整的ActionMethod请求!

I blogged about this little known secret here。我还在博客中介绍了它的位置,这是ASP.NET 1.0 MVC Futures assembly,它是Microsoft的独立插件。

史蒂夫·桑德森实际上给出了一本复杂的逻辑和应用程序构建的例子,我在一本书中称之为Pro ASP.NET MVC(无耻的插件,我知道,但这是你在问题中寻找的),他实际使用的是的RenderAction!我做了博客文章,在我读这本书之前,所以我很高兴我们在同一页上。

实际上,ASP.NET MVC团队开发了许多扩展和功能,这些扩展和功能被排除在ASP.NET MVC 1.0项目之外 - 其中大部分都使复杂项目更易于管理。这就是为什么更复杂的例子(在大多数人的答案中列出)必须使用某种类型的自定义ViewEngine,或者使用基本控制器和自定义控制器的一些大箍跳。我查看了几乎所有上面列出的开源版本。

但它归结为什么不是在看一个复杂的例子,而是知道如何实现你想要的复杂逻辑 - 比如当你拥有的导航栏是一个单一控制器中的ViewModel来处理。只需将导航栏绑定到每个ViewModel,就会非常累人。

所以,这些的一个例子是Html.RenderAction()扩展(我开始时),它允许你从视图模型/控制器移动那个更复杂/抽象的逻辑(它甚至不是你关心的) ,并将其置于其所属的控制器操作中。

这个小宝宝已经为我保存了MVC,特别是我正在进行的大型企业项目。

你可以将你的视图模型传递给RenderAction,或者只渲染像页脚或标题区域 - 之类的东西,让逻辑包含在你可以解雇和忘记的那些动作中(编写RenderAction,忘了任何关于它对页眉或页脚做什么的担忧)

答案 2 :(得分:2)

欢迎您查看good.codeplex.com

它有很多你在上面寻求的东西,但还有工作要做!但是,在你看完之后,我很乐意在这里或者在codeplex上提出问题。

这是mygoodpoints.org当前正在运行的内容。

答案 3 :(得分:0)

  

我的ViewModel必须拥有   属性覆盖每一个   我所瞄准的“页面”的方面   渲染为输出?

是。 RenderAction还有另一个选项,但除此之外,一般来说ViewModel通常很大,你必须找到一个很好的方法来填充它。我承认这听起来像是一个麻烦点。

答案 4 :(得分:0)

AtomSite是使用ASP.NET MVC编写的博客引擎

答案 5 :(得分:0)

据我所知,Controller直接返回一个View,可以使用ViewData或Context将数据传递给View。

前者只是各种数据的松散包,而后者是特定类型。

ViewModel将作为Context传递给View(并且View的标记将强烈类型化为它所期望的ViewModel类型。)

这是我的2c价值:)希望有所帮助 - 抱歉我不能包含任何可下载的示例。

答案 6 :(得分:0)

要自动将数据传递给所有视图,您可以创建自己的控制器类并使用它:

实施例

    public class MyController : Controller

{
    private User _CurrentUser;

    public User CurrentUser
    {
        get
        {
            if (_CurrentUser == null)
                _CurrentUser = (User)Session["CurrentUser"];
            return _CurrentUser;
        }
        set
        {
            _CurrentUser = value;
            Session["CurrentUser"] = _CurrentUser;
        }
    }

    /// <summary>
    /// Use this override to pass data to all views automatically
    /// </summary>
    /// <param name="context"></param>
    protected override void OnActionExecuted(ActionExecutedContext context) 
    {
        base.OnActionExecuted(context);

        if (context.Result is ViewResult) 
        {
            ViewData["CurrentUser"] = CurrentUser;
        }
    }
    }