我们正在评估asp.net MVC,并且正在寻找NerdDinner之外的一些更复杂的例子。
具体来说,在一个更复杂的网络应用程序中,我可能有一个导航栏(包括主导航,搜索框和登录状态显示),主内容区域,子内容区域(包括相关内容)和一个页脚。在MVC中,控制器返回一个ViewModel(如果我认为我想从我的视图中取消我的Controller,则不是视图) - 我的ViewModel是否必须具有覆盖“页面”的每个方面的属性旨在呈现为输出?
如果不清楚,我可以重新提出我的问题。
顺便说一句 - 我知道这个网站是使用MVC构建的。我是可下载的例子。
提前致谢。
答案 0 :(得分:6)
编辑:参考您对视图模型的查询,这不是完美的答案,但我想我会引起对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 :(得分: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;
}
}
}