ASP.NET MVC - 复杂示例?

9

我们正在评估asp.net MVC,并寻找一些比NerdDinner更复杂的示例。

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

如果这不清楚,我可以重新表达我的问题。

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

提前致谢。


4
stackoverflow.com 是用 ASP .NET MVC 构建的。 - David
1
谢谢你,David。我知道这点。当我说“例子”的时候,我是在寻找可以下载的示例,而不仅仅是使用MVC的复杂(或相对复杂)网站的名称。 - Paul Suart
3
请阅读一下这个链接:http://dotnetslackers.com/projects/StackOverflowInspiredKnowledgeExchange/。这是一个旨在将 Stack Overflow 进行分解以供公众消费的项目。 - Dan Atkinson
@Dan - 如果您将该评论作为答案提交,您将获得+1分。 - Paul Suart
嗯,这更像是对David评论的延续,而不是一个独立的答案。 :) - Dan Atkinson
显示剩余3条评论
7个回答

6
请查看CodeCampServer编辑:关于你的视图模型问题,这不是完美的答案,但我想提醒一下AutoMapper(由CodeCampServer使用),它可以帮助自动映射模型和视图模型之间的数据,这真的可以节省时间。还值得考虑输入构建器的概念(在MVCContrib中有一些可用,也有一些在ASP.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 最近他们在努力改进 codeCampServer,这是一个好的迹象。它是 Manning 出版的《Mvc in Action》一书的代码伴侣。 - dove
尽管你可以称我为“笨蛋”,但你能解释一下我该如何获取CodeCampServer应用程序的源代码吗?没有下载选项卡! - Paul Suart
1
您需要使用Subversion客户端,例如TortoiseSVN(www.tortoisesvn.org)来下载代码 - 详细信息请参见源选项卡。 - Luke Bennett
我想编辑你的回答,但我认为直接告诉你CodeCampServer提供的链接已经更改为这里:http://codecampserver.codeplex.com会更好。 - dyslexicanaboko

3

这是你要的:

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

将这些放在您的主页面中,或者在特定视图中用于侧边栏小部件,并将它们的逻辑与您正在处理的控制器/视图模型抽象开来。它们甚至可以读取当前的RouteData(url/action)和ControllerContext(参数/模型),因为您正在处理这些对象中的环境值 - 并执行完整的ActionMethod请求!我在这里博客中介绍了这个鲜为人知的秘密。我还在博客中介绍了它所在的位置,即ASP.NET 1.0 MVC Futures assembly,这是微软的一个单独附加组件。
Steve Sanderson在我拥有的一本书Pro ASP.NET MVC中实际上提供了复杂逻辑和应用程序构建的示例(我知道这是个不要脸的推销,但这正是你在问题中寻找的),他实际上使用了RenderAction!我在读这本书之前就写了博客文章,所以我很高兴我们看法一致。
实际上,ASP.NET MVC团队开发的数十个扩展和功能被留在了ASP.NET MVC 1.0项目之外 - 其中大部分使得复杂项目更加易于管理。这就是为什么更复杂的示例(在大多数人的答案中列出)必须使用某种自定义ViewEngine,或者使用基本控制器和自定义控制器进行大量跳跃的原因。我已经查看了上面列出的几乎所有开源版本。
但最重要的不是看一个复杂的示例,而是知道如何实现你所需的复杂逻辑 - 比如当你只有一个单一控制器中的ViewModel来处理时,如何实现导航栏。每次都必须将navbar与每个ViewModel绑定非常繁琐。
因此,这些示例中的一个是Html.RenderAction()扩展(就像我一开始介绍的那样),它允许您将更复杂/抽象的逻辑从ViewModel/Controller(甚至不是您关心的地方)移动到其自己的控制器操作中。
这个小东西为我节省了MVC,特别是在我目前正在进行的大型企业项目中。
您可以将您的ViewModel传递给RenderAction,或者只呈现任何类似于页脚或页眉区域的内容 - 并且让逻辑包含在这些操作中,您可以轻松地编写RenderAction并忘记任何关于头部或页脚的担忧。

1
这并不是一个小众的秘密 ;) - Alex

2

欢迎您访问good.codeplex.com

它包含了您所需的大部分内容,但还有待完善!不过,在您浏览后,我很乐意在此处或在codeplex上回答您的问题。

mygoodpoints.org目前正在使用它。


附言:如果您有一些JavaScript可以在单击时对水泵进行动画处理,那就太好了。 :) 否则,这是一个非常棒的网站! - Dan Atkinson

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

但是在数百页和数十个“可能”的侧边栏和导航栏小部件中,这很快就会变得混乱。你应该查看Html.RenderAction来处理大部分内容(使用Bing搜索)。 - eduncan911

0
我的ViewModel是否需要拥有覆盖我想要呈现为输出的“页面”的每个方面的属性?
是的。除了RenderAction之外,还有另一种选择,但通常情况下,ViewModel往往很大,您必须找到一个填充它的好方法。我承认这听起来像一个麻烦的地方。

0

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


这个网站是用ASP.NET MVC编写的吗?它看起来有点“非标准”。 - Paul Suart

0
据我所知,控制器直接返回视图,并可以使用ViewData或Context将数据传递给视图。
前者只是各种数据的松散包装,而后者是一种特定类型。
ViewModel将作为上下文传递给视图(视图的标记将强类型化为它所期望的ViewModel类型)。
这就是我的看法 :) 希望有所帮助--很抱歉我无法提供可下载的示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接