diff --git a/src/Orchard.Tests.Packages/DatabaseEnabledTestsBase.cs b/src/Orchard.Tests.Packages/DatabaseEnabledTestsBase.cs index 66d496949..29c8deef3 100644 --- a/src/Orchard.Tests.Packages/DatabaseEnabledTestsBase.cs +++ b/src/Orchard.Tests.Packages/DatabaseEnabledTestsBase.cs @@ -50,6 +50,7 @@ namespace Orchard.Tests.Packages { [TearDown] public void Cleanup() { + _container.Dispose(); _session.Close(); } diff --git a/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs b/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs index 728479f04..b2db15af6 100644 --- a/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs +++ b/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs @@ -9,6 +9,7 @@ using Autofac.Builder; using Moq; using NUnit.Framework; using Orchard.Data; +using Orchard.Environment; using Orchard.Models; using Orchard.Models.Driver; using Orchard.Models.Records; @@ -30,7 +31,10 @@ namespace Orchard.Tests.Packages.Users.Controllers { builder.Register().As().FactoryScoped(); builder.Register().As(); builder.Register().As(); + builder.Register().As(); + builder.Register().As(); builder.Register(new Mock().Object); + builder.Register(new Mock().Object); } protected override IEnumerable DatabaseTypes { @@ -76,10 +80,42 @@ namespace Orchard.Tests.Packages.Users.Controllers { Assert.That(model.Rows, Is.Not.Null); } + public static class Values { + public static IValueProvider Of(T obj) { + return new ValueProvider(obj); + } + class ValueProvider : IValueProvider { + private readonly T _obj; + + public ValueProvider(T obj) { + _obj = obj; + } + + public bool ContainsPrefix(ControllerContext controllerContext, string prefix) { + return typeof(T).GetProperties().Any(x => x.Name.StartsWith(prefix)); + } + + public ValueProviderResult GetValue(ControllerContext controllerContext, string key) { + var property = typeof(T).GetProperty(key); + if (property == null) + return null; + return new ValueProviderResult( + property.GetValue(_obj, null), + Convert.ToString(property.GetValue(_obj, null)), + null); + } + } + } + [Test] public void CreateShouldAddUserAndRedirect() { var controller = _container.Resolve(); - var result = controller.Create(new UserCreateViewModel { UserName = "four",Password="five",ConfirmPassword="five" }); + controller.ValueProvider = Values.Of(new { + UserName = "four", + Password = "five", + ConfirmPassword = "five" + }); + var result = controller._Create(); Assert.That(result, Is.TypeOf()); var redirect = (RedirectToRouteResult)result; @@ -97,8 +133,12 @@ namespace Orchard.Tests.Packages.Users.Controllers { var model = (UserEditViewModel)result.ViewData.Model; Assert.That(model.UserName, Is.EqualTo("two")); - var input = new FormCollection { { "UserName", "bubba" }, { "Email", "hotep" } }; - var result2 = _container.Resolve().Edit(id, input); + var controller = _container.Resolve(); + controller.ValueProvider = Values.Of(new { + UserName = "bubba", + Email = "hotep", + }); + var result2 = controller._Edit(id); Assert.That(result2, Is.TypeOf()); } } diff --git a/src/Orchard.Tests/Models/DefaultModelManagerTests.cs b/src/Orchard.Tests/Models/DefaultModelManagerTests.cs index 5cc0e9669..3bec347f8 100644 --- a/src/Orchard.Tests/Models/DefaultModelManagerTests.cs +++ b/src/Orchard.Tests/Models/DefaultModelManagerTests.cs @@ -175,7 +175,7 @@ namespace Orchard.Tests.Models { [Test] public void EditorsShouldBeOrderedByPositionAndDefaultPositionIsSix() { var alpha = _manager.New("alpha"); - var templates = _manager.BuildDisplayModel(alpha, null, null).Displays; + var templates = _manager.BuildDisplayModel(alpha, null).Displays; Assert.That(templates.Count(), Is.EqualTo(3)); var t0 = templates.First(); diff --git a/src/Orchard.Tests/Models/PartDriverHandlerTests.cs b/src/Orchard.Tests/Models/PartDriverHandlerTests.cs index 7caa26463..9996ab7a0 100644 --- a/src/Orchard.Tests/Models/PartDriverHandlerTests.cs +++ b/src/Orchard.Tests/Models/PartDriverHandlerTests.cs @@ -41,7 +41,7 @@ namespace Orchard.Tests.Models { }); var contentHandler = _container.Resolve(); - var ctx = new BuildDisplayModelContext(new ItemDisplayModel(new ContentItem()), null, null, null); + var ctx = new BuildDisplayModelContext(new ItemDisplayModel(new ContentItem()), null); driver1.Verify(x => x.BuildDisplayModel(ctx), Times.Never()); contentHandler.BuildDisplayModel(ctx); @@ -58,7 +58,7 @@ namespace Orchard.Tests.Models { var item = new ContentItem(); item.Weld(new StubPart { Foo = new[] { "a", "b", "c" } }); - var ctx = new BuildDisplayModelContext(new ItemDisplayModel(item), "", "", null); + var ctx = new BuildDisplayModelContext(new ItemDisplayModel(item), ""); Assert.That(ctx.DisplayModel.Displays.Count(), Is.EqualTo(0)); contentHandler.BuildDisplayModel(ctx); Assert.That(ctx.DisplayModel.Displays.Count(), Is.EqualTo(1)); @@ -71,7 +71,7 @@ namespace Orchard.Tests.Models { get { return "Stub"; } } - protected override DriverResult Display(StubPart part, string groupName, string displayType) { + protected override DriverResult Display(StubPart part, string displayType) { var viewModel = new StubViewModel { Foo = string.Join(",", part.Foo) }; if (displayType.StartsWith("Summary")) return PartialView(viewModel, "StubViewModelTerse").Location("topmeta"); @@ -79,12 +79,12 @@ namespace Orchard.Tests.Models { return PartialView(viewModel).Location("topmeta"); } - protected override DriverResult Editor(StubPart part, string groupName) { + protected override DriverResult Editor(StubPart part) { var viewModel = new StubViewModel { Foo = string.Join(",", part.Foo) }; return PartialView(viewModel).Location("last", "10"); } - protected override DriverResult Editor(StubPart part, string groupName, IUpdateModel updater) { + protected override DriverResult Editor(StubPart part, IUpdateModel updater) { var viewModel = new StubViewModel { Foo = string.Join(",", part.Foo) }; updater.TryUpdateModel(viewModel, Prefix, null, null); part.Foo = viewModel.Foo.Split(new[] { ',' }).Select(x => x.Trim()).ToArray(); diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index f6d20d6eb..f95caaea5 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -141,7 +141,7 @@ - + diff --git a/src/Orchard.Web/Core/Settings/Controllers/AdminController.cs b/src/Orchard.Web/Core/Settings/Controllers/AdminController.cs index 0b52d0238..898b7f4d0 100644 --- a/src/Orchard.Web/Core/Settings/Controllers/AdminController.cs +++ b/src/Orchard.Web/Core/Settings/Controllers/AdminController.cs @@ -26,14 +26,14 @@ namespace Orchard.Core.Settings.Controllers { public ActionResult Index(string tabName) { var model = new Orchard.Core.Settings.ViewModels.SettingsIndexViewModel { Site = _siteService.GetSiteSettings().As() }; - model.EditorModel = _modelManager.BuildEditorModel(model.Site, tabName); + model.EditorModel = _modelManager.BuildEditorModel(model.Site); return View(model); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(string tabName, FormCollection input) { var viewModel = new SettingsIndexViewModel { Site = _siteService.GetSiteSettings().As() }; - viewModel.EditorModel = _modelManager.UpdateEditorModel(viewModel.Site.ContentItem, tabName, this); + viewModel.EditorModel = _modelManager.UpdateEditorModel(viewModel.Site.ContentItem, this); if (!TryUpdateModel(viewModel, input.ToValueProvider())) { return View(viewModel); diff --git a/src/Orchard.Web/Core/Settings/Views/Admin/Index.aspx b/src/Orchard.Web/Core/Settings/Views/Admin/Index.aspx index 0eb8adee9..df64d5069 100644 --- a/src/Orchard.Web/Core/Settings/Views/Admin/Index.aspx +++ b/src/Orchard.Web/Core/Settings/Views/Admin/Index.aspx @@ -1,10 +1,28 @@ <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> -<%@ Import Namespace="Orchard.Mvc.Html"%> -

Edit Settings

+ +<%@ Import Namespace="Orchard.Mvc.Html" %> +

+ Edit Settings

<%using (Html.BeginForm()) { %> - <%= Html.ValidationSummary() %> - <%= Html.EditorForModel() %> +<%= Html.ValidationSummary() %> +
+ Global Settings
- + <%=Html.LabelFor(x=>x.SiteName) %> + <%=Html.EditorFor(x=>x.SiteName) %> + <%=Html.ValidationMessage("SiteName", "*") %>
+
+ <%=Html.LabelFor(x => x.SuperUser) %> + <%=Html.EditorFor(x=>x.SuperUser) %> + <%=Html.ValidationMessage("SuperUser", "*") %> +
+ <%=Html.EditorFor(s=>s.Id) %> +
+<% foreach (var e in Model.EditorModel.Editors) { %> +<%=Html.EditorFor(m => e.Model, e.TemplateName, e.Prefix)%> +<% } %> +
+ +
<% } %> \ No newline at end of file diff --git a/src/Orchard.Web/Core/Themes/ViewModels/CreateThemeViewModel.cs b/src/Orchard.Web/Core/Themes/ViewModels/CreateThemeViewModel.cs new file mode 100644 index 000000000..f04265db6 --- /dev/null +++ b/src/Orchard.Web/Core/Themes/ViewModels/CreateThemeViewModel.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Web; +using Orchard.Mvc.ViewModels; + +namespace Orchard.Core.Themes.ViewModels { + public class CreateThemeViewModel : AdminViewModel { + [Required] + public string Name { get; set; } + [Required] + public string Author { get; set; } + [Required] + public string Description { get; set; } + [Required] + public string Version { get; set; } + [Required] + public string Tags { get; set; } + [Required] + public string Homepage { get; set; } + } +} diff --git a/src/Orchard.Web/Core/Themes/Views/Shared/document.aspx b/src/Orchard.Web/Core/Themes/Views/document.aspx similarity index 100% rename from src/Orchard.Web/Core/Themes/Views/Shared/document.aspx rename to src/Orchard.Web/Core/Themes/Views/document.aspx diff --git a/src/Orchard.Web/Orchard.Web.csproj b/src/Orchard.Web/Orchard.Web.csproj index 033dd8dba..4a5437642 100644 --- a/src/Orchard.Web/Orchard.Web.csproj +++ b/src/Orchard.Web/Orchard.Web.csproj @@ -165,6 +165,7 @@ + diff --git a/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogAdminController.cs b/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogAdminController.cs index 39de6741d..38964da48 100644 --- a/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogAdminController.cs +++ b/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogAdminController.cs @@ -20,7 +20,7 @@ namespace Orchard.Blogs.Controllers { public ActionResult List() { //TODO: (erikpo) Need to make templatePath be more convention based so if my controller name has "Admin" in it then "Admin/{type}" is assumed var model = new AdminBlogsViewModel { - Blogs = _blogService.Get().Select(b => _contentManager.BuildDisplayModel(b, null, "Summary", "Admin/Blog")) + Blogs = _blogService.Get().Select(b => _contentManager.BuildDisplayModel(b, "SummaryAdmin")) }; return View(model); @@ -35,7 +35,7 @@ namespace Orchard.Blogs.Controllers { //TODO: (erikpo) Need to make templatePath be more convention based so if my controller name has "Admin" in it then "Admin/{type}" is assumed var model = new BlogForAdminViewModel { - Blog = _contentManager.BuildDisplayModel(blog, null, "Detail", "Admin/Blog") + Blog = _contentManager.BuildDisplayModel(blog, "DetailAdmin") }; return View(model); diff --git a/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogController.cs b/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogController.cs index 30ab77393..487ae0cc1 100644 --- a/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogController.cs +++ b/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogController.cs @@ -37,7 +37,7 @@ namespace Orchard.Blogs.Controllers { public ActionResult List() { var model = new BlogsViewModel { - Blogs = _blogService.Get().Select(b => _contentManager.BuildDisplayModel(b, null, "Summary")) + Blogs = _blogService.Get().Select(b => _contentManager.BuildDisplayModel(b, "Summary")) }; return View(model); @@ -51,7 +51,7 @@ namespace Orchard.Blogs.Controllers { return new NotFoundResult(); var model = new BlogViewModel { - Blog = _contentManager.BuildDisplayModel(blog, null, "Detail") + Blog = _contentManager.BuildDisplayModel(blog, "Detail") }; return View(model); @@ -68,7 +68,7 @@ namespace Orchard.Blogs.Controllers { return new NotFoundResult(); var model = new CreateBlogViewModel { - Blog = _contentManager.BuildEditorModel(blog, null) + Blog = _contentManager.BuildEditorModel(blog) }; return View(model); @@ -80,7 +80,7 @@ namespace Orchard.Blogs.Controllers { if (!_authorizer.Authorize(Permissions.CreateBlog, T("Couldn't create blog"))) return new HttpUnauthorizedResult(); - model.Blog = _contentManager.UpdateEditorModel(_contentManager.New("blog"), null, this); + model.Blog = _contentManager.UpdateEditorModel(_contentManager.New("blog"), this); if (!ModelState.IsValid) return View(model); @@ -106,7 +106,7 @@ namespace Orchard.Blogs.Controllers { return new NotFoundResult(); var model = new BlogEditViewModel { - Blog = _contentManager.BuildEditorModel(blog, "") + Blog = _contentManager.BuildEditorModel(blog) }; return View(model); @@ -124,7 +124,7 @@ namespace Orchard.Blogs.Controllers { return new NotFoundResult(); var model = new BlogEditViewModel { - Blog = _contentManager.UpdateEditorModel(blog, "", this) + Blog = _contentManager.UpdateEditorModel(blog, this) }; if (!ModelState.IsValid) diff --git a/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogPostController.cs b/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogPostController.cs index 215f9d473..fc4d9b07c 100644 --- a/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogPostController.cs +++ b/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogPostController.cs @@ -56,7 +56,7 @@ namespace Orchard.Blogs.Controllers { var model = new BlogPostViewModel { Blog = blog, - BlogPost = _contentManager.BuildDisplayModel(post, null, "Detail") + BlogPost = _contentManager.BuildDisplayModel(post, "Detail") }; return View(model); @@ -95,7 +95,7 @@ namespace Orchard.Blogs.Controllers { if (blog == null) return new NotFoundResult(); - var blogPost = _contentManager.BuildEditorModel(_contentManager.New("blogpost"), null); + var blogPost = _contentManager.BuildEditorModel(_contentManager.New("blogpost")); blogPost.Item.Blog = blog; var model = new CreateBlogPostViewModel { @@ -117,7 +117,7 @@ namespace Orchard.Blogs.Controllers { return new NotFoundResult(); BlogPost blogPost = _contentManager.Create("blogpost", bp => { bp.Blog = blog; }); - model.BlogPost = _contentManager.UpdateEditorModel(blogPost, null, this); + model.BlogPost = _contentManager.UpdateEditorModel(blogPost, this); if (!ModelState.IsValid) return View(model); @@ -145,7 +145,7 @@ namespace Orchard.Blogs.Controllers { return new NotFoundResult(); var model = new BlogPostEditViewModel { - BlogPost = _contentManager.BuildEditorModel(post, null) + BlogPost = _contentManager.BuildEditorModel(post) }; return View(model); @@ -168,7 +168,7 @@ namespace Orchard.Blogs.Controllers { return new NotFoundResult(); var model = new BlogPostEditViewModel { - BlogPost = _contentManager.UpdateEditorModel(post, null, this) + BlogPost = _contentManager.UpdateEditorModel(post, this) }; IValueProvider values = input.ToValueProvider(); diff --git a/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogHandler.cs b/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogHandler.cs index ba120a301..d67b9a045 100644 --- a/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogHandler.cs +++ b/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogHandler.cs @@ -16,7 +16,7 @@ namespace Orchard.Blogs.Models { Filters.Add(new ActivatingFilter("blog")); Filters.Add(new ActivatingFilter("blog")); Filters.Add(new StorageFilter(repository)); - Filters.Add(new ContentItemTemplates("Detail", "Summary")); + Filters.Add(new ContentItemTemplates("Items/Blogs.Blog", "Detail Summary")); OnGetEditorViewModel((context, blog) => context.AddEditor(new TemplateViewModel(blog) { TemplateName = "Blog/Fields", ZoneName = "primary", Position = "1" }) diff --git a/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogPostHandler.cs b/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogPostHandler.cs index d3b3119ad..9abdefefd 100644 --- a/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogPostHandler.cs +++ b/src/Orchard.Web/Packages/Orchard.Blogs/Models/BlogPostHandler.cs @@ -24,7 +24,7 @@ namespace Orchard.Blogs.Models { Filters.Add(new ActivatingFilter("blogpost")); Filters.Add(new ActivatingFilter("blogpost")); Filters.Add(new StorageFilter(repository)); - Filters.Add(new ContentItemTemplates("Detail", "Summary")); + Filters.Add(new ContentItemTemplates("Items/Blogs.BlogPost", "Detail Summary")); OnCreated((context, bp) => bp.Blog.PostCount++); @@ -59,10 +59,15 @@ namespace Orchard.Blogs.Models { switch(context.DisplayType) { case "Detail": context.AddDisplay( - //TODO: (erikpo) Need to make templatePath be more convention based so if my controller name has "Admin" in it then "Admin/{type}" is assumed - new TemplateViewModel(posts.Select(bp => contentManager.BuildDisplayModel(bp, null, "Summary", "Admin/BlogPost"))) - { - TemplateName = "Admin/BlogPost/List", + new TemplateViewModel(posts.Select(bp => contentManager.BuildDisplayModel(bp, "Summary"))) { + TemplateName = "BlogPost/List", + ZoneName = "body" + }); + break; + case "DetailAdmin": + context.AddDisplay( + new TemplateViewModel(posts.Select(bp => contentManager.BuildDisplayModel(bp, "SummaryAdmin"))) { + TemplateName = "BlogPost/ListAdmin", ZoneName = "body" }); break; diff --git a/src/Orchard.Web/Packages/Orchard.Blogs/Orchard.Blogs.csproj b/src/Orchard.Web/Packages/Orchard.Blogs/Orchard.Blogs.csproj index 15372e22f..dbb4f8059 100644 --- a/src/Orchard.Web/Packages/Orchard.Blogs/Orchard.Blogs.csproj +++ b/src/Orchard.Web/Packages/Orchard.Blogs/Orchard.Blogs.csproj @@ -158,9 +158,8 @@ False - False - - + True + http://orchard.codeplex.com/ False diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/ContentController.cs b/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/ContentController.cs index 162f1b335..bb1307ca0 100644 --- a/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/ContentController.cs +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/ContentController.cs @@ -36,8 +36,8 @@ namespace Orchard.DevTools.Controllers { .Select(x => x.GetType()) .SelectMany(x => AllTypes(x)) .Distinct(); - model.DisplayModel = _contentManager.BuildDisplayModel(model.Item, null, null); - model.EditorModel = _contentManager.BuildEditorModel(model.Item, null); + model.DisplayModel = _contentManager.BuildDisplayModel(model.Item, null); + model.EditorModel = _contentManager.BuildEditorModel(model.Item); return View(model); } diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Models/DebugLinkHandler.cs b/src/Orchard.Web/Packages/Orchard.DevTools/Models/DebugLinkHandler.cs index 7c53f14ac..8557277bc 100644 --- a/src/Orchard.Web/Packages/Orchard.DevTools/Models/DebugLinkHandler.cs +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Models/DebugLinkHandler.cs @@ -4,10 +4,10 @@ using Orchard.Models.ViewModels; namespace Orchard.DevTools.Models { public class DebugLinkHandler : ContentHandler { protected override void BuildDisplayModel(BuildDisplayModelContext context) { - context.AddDisplay(new TemplateViewModel(new ShowDebugLink { ContentItem = context.ContentItem }) { ZoneName = "recap", Position = "9999" }); + context.AddDisplay(new TemplateViewModel(new ShowDebugLink { ContentItem = context.ContentItem }) { TemplateName="Parts/DevTools.ShowDebugLink", ZoneName = "recap", Position = "9999" }); } protected override void BuildEditorModel(BuildEditorModelContext context) { - context.AddEditor(new TemplateViewModel(new ShowDebugLink { ContentItem = context.ContentItem }) { ZoneName = "recap", Position = "9999" }); + context.AddEditor(new TemplateViewModel(new ShowDebugLink { ContentItem = context.ContentItem }) { TemplateName = "Parts/DevTools.ShowDebugLink", ZoneName = "recap", Position = "9999" }); } } } diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Orchard.DevTools.csproj b/src/Orchard.Web/Packages/Orchard.DevTools/Orchard.DevTools.csproj index ef60428f8..259e3969b 100644 --- a/src/Orchard.Web/Packages/Orchard.DevTools/Orchard.DevTools.csproj +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Orchard.DevTools.csproj @@ -75,8 +75,8 @@ - - + + @@ -88,6 +88,8 @@ + + diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Details.aspx b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Details.aspx index 1d4f0611f..11a40e688 100644 --- a/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Details.aspx +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Details.aspx @@ -3,121 +3,100 @@ <%@ Import Namespace="System.Reflection" %> <%@ Import Namespace="Orchard.Mvc.Html" %> - - - - TwoColumns - " rel="stylesheet" type="text/css" /> - - - -
- -
-

- Content Item

-

- Id: - <%=Model.Item.ContentItem.Id %>

-

- ContentType: - <%=Model.Item.ContentItem.ContentType%> <%=Html.ItemDisplayLink(Model.Item) %> <%=Html.ItemEditLink("edit", Model.Item) %>

-

- Content Item Parts

-
    - <%foreach (var partType in Model.PartTypes.OrderBy(x => x.Name)) {%> -
  • - <%if (partType.IsGenericType) {%><%=Html.Encode(partType.Name +" "+partType.GetGenericArguments().First().Name)%> - <%=Html.Encode(" (" + partType.GetGenericArguments().First().Namespace + ")")%><%} - else {%><%=Html.Encode(partType.Name)%> - <%=Html.Encode( " (" + partType.Namespace + ")")%><% - } - - %> -
      - <%foreach (var prop in partType.GetProperties().Where(x => x.DeclaringType == partType)) { - var value = prop.GetValue(Model.Locate(partType), null);%> -
    • - <%=Html.Encode(prop.Name) %>: - <%=Html.Encode(value) %> - <%var valueItem = value as ContentItem; - if (valueItem == null && value is IContent) { - valueItem = (value as IContent).ContentItem; - } - if (valueItem != null) { - %><%=Html.ActionLink(valueItem.ContentType + " #" + valueItem.Id, "details", new { valueItem.Id }, new { })%><% - } - %> -
        - <%if (value == null || prop.PropertyType.IsPrimitive || prop.PropertyType == typeof(string)) { } - else if (typeof(IEnumerable).IsAssignableFrom(prop.PropertyType)) { - foreach (var item in value as IEnumerable) { - %> -
      • <%=Html.Encode(item.GetType().Name) %>:<%=Html.Encode(item) %>
      • - <% - } - } - else {%> - <%foreach (var prop2 in value.GetType().GetProperties().Where(x => x.GetIndexParameters().Count() == 0)) {%> -
      • - <%=Html.Encode(prop2.Name)%> - <%=Html.Encode(prop2.GetValue(value, null))%>
      • - <%} %> - <%} %> -
      -
    • - <%} %> -
    -
  • - <%}%> -
-

- Displays

-
    - <%foreach (var display in Model.Displays) {%> -
  • - <%=Html.Encode(display.Prefix)%> - <%=Html.Encode(display.Model.GetType().Name)%> - (<%=Html.Encode(display.Model.GetType().Namespace)%>) - Prefix:<%=Html.Encode(display.Prefix ?? "(null)")%> - Zone:<%=Html.Encode(display.ZoneName ?? "(null)")%> - Position:<%=Html.Encode(display.Position ?? "(null)")%> -
    - <%=Html.DisplayFor(x => display.Model, display.TemplateName, display.Prefix)%> -
    -
  • - <% - }%> -
-

- Editors

-
    - <%foreach (var editor in Model.Editors) {%> -
  • - <%=Html.Encode(editor.Prefix) %> - <%=Html.Encode(editor.Model.GetType().Name) %> - (<%=Html.Encode(editor.Model.GetType().Namespace) %>) - Prefix:<%=Html.Encode(editor.Prefix ?? "(null)")%> - Zone:<%=Html.Encode(editor.ZoneName ?? "(null)")%> - Position:<%=Html.Encode(editor.Position??"(null)") %> -
    - <%=Html.EditorFor(x=>editor.Model, editor.TemplateName, editor.Prefix) %> -
    -
  • - <% - }%> -
+

Content Item

+

+ Id: + <%=Model.Item.ContentItem.Id %>

+

+ ContentType: + <%=Model.Item.ContentItem.ContentType%> <%=Html.ItemDisplayLink(Model.Item) %> <%=Html.ItemEditLink("edit", Model.Item) %>

+ + +

Content Item Parts

+
    + <%foreach (var partType in Model.PartTypes.OrderBy(x => x.Name)) {%> +
  • + <%if (partType.IsGenericType) {%><%=Html.Encode(partType.Name +" "+partType.GetGenericArguments().First().Name)%> + <%=Html.Encode(" (" + partType.GetGenericArguments().First().Namespace + ")")%><%} + else {%><%=Html.Encode(partType.Name)%> + <%=Html.Encode( " (" + partType.Namespace + ")")%><% + } + + %> +
      + <%foreach (var prop in partType.GetProperties().Where(x => x.DeclaringType == partType)) { + var value = prop.GetValue(Model.Locate(partType), null);%> +
    • + <%=Html.Encode(prop.Name) %>: + <%=Html.Encode(value) %> + <%var valueItem = value as ContentItem; + if (valueItem == null && value is IContent) { + valueItem = (value as IContent).ContentItem; + } + if (valueItem != null) { + %><%=Html.ActionLink(valueItem.ContentType + " #" + valueItem.Id, "details", new { valueItem.Id }, new { })%><% + } + %> +
        + <%if (value == null || prop.PropertyType.IsPrimitive || prop.PropertyType == typeof(string)) { } + else if (typeof(IEnumerable).IsAssignableFrom(prop.PropertyType)) { + foreach (var item in value as IEnumerable) { + %> +
      • <%=Html.Encode(item.GetType().Name) %>:<%=Html.Encode(item) %>
      • + <% + } + + } + else {%> + <%foreach (var prop2 in value.GetType().GetProperties().Where(x => x.GetIndexParameters().Count() == 0)) {%> +
      • + <%=Html.Encode(prop2.Name)%> + <%=Html.Encode(prop2.GetValue(value, null))%>
      • + <%} %> + <%} %> +
      +
    • + <%} %> +
    +
  • + <%}%> +
+ + +

Displays

+
    + <%foreach (var display in Model.Displays) {%> +
  • + <%=Html.Encode(display.Prefix)%> + <%=Html.Encode(display.Model.GetType().Name)%> + (<%=Html.Encode(display.Model.GetType().Namespace)%>) + Prefix:<%=Html.Encode(display.Prefix ?? "(null)")%> + Zone:<%=Html.Encode(display.ZoneName ?? "(null)")%> + Position:<%=Html.Encode(display.Position ?? "(null)")%> +
    + <%=Html.DisplayFor(x => display.Model, display.TemplateName, display.Prefix)%>
    -
  • + <% + }%> +
+ + +

Editors

+
    + <%foreach (var editor in Model.Editors) {%> +
  • + <%=Html.Encode(editor.Prefix) %> + <%=Html.Encode(editor.Model.GetType().Name) %> + (<%=Html.Encode(editor.Model.GetType().Namespace) %>) + Prefix:<%=Html.Encode(editor.Prefix ?? "(null)")%> + Zone:<%=Html.Encode(editor.ZoneName ?? "(null)")%> + Position:<%=Html.Encode(editor.Position??"(null)") %> +
    + <%=Html.EditorFor(x=>editor.Model, editor.TemplateName, editor.Prefix) %>
    -
- - + + <% + }%> + diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Index.aspx b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Index.aspx index a778aa3a1..89912eb0d 100644 --- a/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Index.aspx +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Content/Index.aspx @@ -1,27 +1,7 @@ <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> <%@ Import Namespace="Orchard.Mvc.Html"%> - - - - TwoColumns - " rel="stylesheet" type="text/css" /> - - - - - -
- - -

Content Types

    <%foreach(var item in Model.Types.OrderBy(x=>x.Name)){%> @@ -38,13 +18,3 @@ <%}%>
-
- - -
- - - - diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Views/Shared/DisplayTemplates/ShowDebugLink.ascx b/src/Orchard.Web/Packages/Orchard.DevTools/Views/DisplayTemplates/Parts/DevTools.ShowDebugLink.ascx similarity index 100% rename from src/Orchard.Web/Packages/Orchard.DevTools/Views/Shared/DisplayTemplates/ShowDebugLink.ascx rename to src/Orchard.Web/Packages/Orchard.DevTools/Views/DisplayTemplates/Parts/DevTools.ShowDebugLink.ascx diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Views/Shared/EditorTemplates/ShowDebugLink.ascx b/src/Orchard.Web/Packages/Orchard.DevTools/Views/EditorTemplates/Parts/DevTools.ShowDebugLink.ascx similarity index 100% rename from src/Orchard.Web/Packages/Orchard.DevTools/Views/Shared/EditorTemplates/ShowDebugLink.ascx rename to src/Orchard.Web/Packages/Orchard.DevTools/Views/EditorTemplates/Parts/DevTools.ShowDebugLink.ascx diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Views/Home/Index.aspx b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Home/Index.aspx index 4ed8fb1b8..fdd64c021 100644 --- a/src/Orchard.Web/Packages/Orchard.DevTools/Views/Home/Index.aspx +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Views/Home/Index.aspx @@ -2,37 +2,4 @@ <%@ Import Namespace="Orchard.Mvc.ViewModels"%> <%@ Import Namespace="Orchard.Mvc.Html"%> - - - - - TwoColumns - " rel="stylesheet" type="text/css" /> - - - - - -
- - -
-

<%=Html.ActionLink("Contents", "Index", "Content") %>

- -
- - -
- - - - diff --git a/src/Orchard.Web/Packages/Orchard.Roles/Controllers/UserRolesDriver.cs b/src/Orchard.Web/Packages/Orchard.Roles/Controllers/UserRolesDriver.cs new file mode 100644 index 000000000..b7a800b21 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Roles/Controllers/UserRolesDriver.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Orchard.Data; +using Orchard.Models; +using Orchard.Models.Driver; +using Orchard.Models.ViewModels; +using Orchard.Roles.Models.NoRecord; +using Orchard.Roles.Records; +using Orchard.Roles.Services; +using Orchard.Roles.ViewModels; +using Orchard.Security; +using Orchard.UI.Notify; + +namespace Orchard.Roles.Controllers { + public class UserRolesDriver : PartDriver { + private readonly IRepository _userRolesRepository; + private readonly IRoleService _roleService; + private readonly INotifier _notifier; + + public UserRolesDriver( + IRepository userRolesRepository, + IRoleService roleService, + INotifier notifier) { + _userRolesRepository = userRolesRepository; + _roleService = roleService; + _notifier = notifier; + } + + protected override string Prefix { + get { + return "UserRoles"; + } + } + + protected override DriverResult Editor(UserRoles userRoles) { + var roles = + _roleService.GetRoles().Select( + x => new UserRoleEntry { + RoleId = x.Id, + Name = x.Name, + Granted = userRoles.Roles.Contains(x.Name) + }); + + var model = new UserRolesViewModel { + User = userRoles.As(), + UserRoles = userRoles, + Roles = roles.ToList(), + }; + return PartialView(model, "Parts/Roles.UserRoles"); + } + + protected override DriverResult Editor(UserRoles userRoles, IUpdateModel updater) { + var model = new UserRolesViewModel { + User = userRoles.As(), + UserRoles = userRoles, + }; + + if (updater.TryUpdateModel(model, "UserRoles", null, null)) { + + var currentUserRoleRecords = _userRolesRepository.Fetch(x => x.UserId == model.User.Id); + var currentRoleRecords = currentUserRoleRecords.Select(x => x.Role); + var targetRoleRecords = model.Roles.Where(x => x.Granted).Select(x => _roleService.GetRole(x.RoleId)); + + foreach (var addingRole in targetRoleRecords.Where(x => !currentRoleRecords.Contains(x))) { + _notifier.Warning(string.Format("Adding role {0} to user {1}", addingRole.Name, userRoles.As().UserName)); + _userRolesRepository.Create(new UserRolesRecord { UserId = model.User.Id, Role = addingRole }); + } + + foreach (var removingRole in currentUserRoleRecords.Where(x => !targetRoleRecords.Contains(x.Role))) { + _notifier.Warning(string.Format("Removing role {0} from user {1}", removingRole.Role.Name, userRoles.As().UserName)); + _userRolesRepository.Delete(removingRole); + } + + } + return PartialView(model, "Parts/Roles.UserRoles"); + } + } +} diff --git a/src/Orchard.Web/Packages/Orchard.Roles/Models/UserRolesHandler.cs b/src/Orchard.Web/Packages/Orchard.Roles/Models/UserRolesHandler.cs index e28f7df6e..7d181296b 100644 --- a/src/Orchard.Web/Packages/Orchard.Roles/Models/UserRolesHandler.cs +++ b/src/Orchard.Web/Packages/Orchard.Roles/Models/UserRolesHandler.cs @@ -13,13 +13,9 @@ using Orchard.UI.Notify; namespace Orchard.Roles.Models { public class UserRolesHandler : ContentHandler { private readonly IRepository _userRolesRepository; - private readonly IRoleService _roleService; - private readonly INotifier _notifier; - public UserRolesHandler(IRepository userRolesRepository, IRoleService roleService, INotifier notifier) { + public UserRolesHandler(IRepository userRolesRepository) { _userRolesRepository = userRolesRepository; - _roleService = roleService; - _notifier = notifier; Filters.Add(new ActivatingFilter("user")); OnLoaded((context, userRoles) => { @@ -29,51 +25,6 @@ namespace Orchard.Roles.Models { }); } - protected override void BuildEditorModel(BuildEditorModelContext context) { - var userRoles = context.ContentItem.As(); - if (userRoles != null) { - var roles = - _roleService.GetRoles().Select( - x => new UserRoleEntry { - RoleId = x.Id, - Name = x.Name, - Granted = userRoles.Roles.Contains(x.Name) - }); - - var viewModel = new UserRolesViewModel { - User = userRoles.As(), - UserRoles = userRoles, - Roles = roles.ToList(), - }; - - context.AddEditor(new TemplateViewModel(viewModel, "UserRoles")); - } - } - - protected override void UpdateEditorModel(UpdateEditorModelContext context) { - var userRoles = context.ContentItem.As(); - if (userRoles != null) { - var viewModel = new UserRolesViewModel(); - if (context.Updater.TryUpdateModel(viewModel, "UserRoles", null, null)) { - - var currentUserRoleRecords = _userRolesRepository.Fetch(x => x.UserId == context.ContentItem.Id); - var currentRoleRecords = currentUserRoleRecords.Select(x => x.Role); - var targetRoleRecords = viewModel.Roles.Where(x => x.Granted).Select(x => _roleService.GetRole(x.RoleId)); - - foreach (var addingRole in targetRoleRecords.Where(x => !currentRoleRecords.Contains(x))) { - _notifier.Warning(string.Format("Adding role {0} to user {1}", addingRole.Name, userRoles.As().UserName)); - _userRolesRepository.Create(new UserRolesRecord { UserId = context.ContentItem.Id, Role = addingRole }); - } - - foreach (var removingRole in currentUserRoleRecords.Where(x => !targetRoleRecords.Contains(x.Role))) { - _notifier.Warning(string.Format("Removing role {0} from user {1}", removingRole.Role.Name, userRoles.As().UserName)); - _userRolesRepository.Delete(removingRole); - } - - } - context.AddEditor(new TemplateViewModel(viewModel, "UserRoles")); - } - } } } diff --git a/src/Orchard.Web/Packages/Orchard.Roles/Orchard.Roles.csproj b/src/Orchard.Web/Packages/Orchard.Roles/Orchard.Roles.csproj index 4ed72ca00..ae769ef91 100644 --- a/src/Orchard.Web/Packages/Orchard.Roles/Orchard.Roles.csproj +++ b/src/Orchard.Web/Packages/Orchard.Roles/Orchard.Roles.csproj @@ -63,6 +63,7 @@ + @@ -82,7 +83,7 @@ - + diff --git a/src/Orchard.Web/Packages/Orchard.Roles/Views/EditorTemplates/Parts/Roles.UserRoles.ascx b/src/Orchard.Web/Packages/Orchard.Roles/Views/EditorTemplates/Parts/Roles.UserRoles.ascx new file mode 100644 index 000000000..8a4ce8e23 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Roles/Views/EditorTemplates/Parts/Roles.UserRoles.ascx @@ -0,0 +1,18 @@ +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> +
+ Roles + <% if (Model.Roles.Count > 0) { + var index = 0; + foreach (var entry in Model.Roles) {%> + <%=Html.Hidden("Roles[" + index + "].RoleId", entry.RoleId)%> + <%=Html.Hidden("Roles[" + index + "].Name", entry.Name)%> + + <%++index; + } + } + else { + %>

There are no roles

<% + } %> +
diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs index 4375fafcd..ae792aeb5 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Controllers/PageController.cs @@ -32,7 +32,7 @@ namespace Orchard.Sandbox.Controllers { Pages = _contentManager.Query() .OrderBy(x => x.Name) .List() - .Select(x => _contentManager.BuildDisplayModel(x, null, "SummaryList")) + .Select(x => _contentManager.BuildDisplayModel(x, "SummaryList")) }; return View(model); } @@ -40,7 +40,7 @@ namespace Orchard.Sandbox.Controllers { public ActionResult Show(int id) { var page = _contentManager.Get(id); var model = new PageShowViewModel { - Page = _contentManager.BuildDisplayModel(page, null, "Detail") + Page = _contentManager.BuildDisplayModel(page, "Detail") }; return View(model); } @@ -80,7 +80,7 @@ namespace Orchard.Sandbox.Controllers { var page = _contentManager.Get(id); var model = new PageEditViewModel { - Page = _contentManager.BuildEditorModel(page, null) + Page = _contentManager.BuildEditorModel(page) }; return View(model); } @@ -95,7 +95,7 @@ namespace Orchard.Sandbox.Controllers { var page = _contentManager.Get(id); var model = new PageEditViewModel { - Page = _contentManager.UpdateEditorModel(page, null, this) + Page = _contentManager.UpdateEditorModel(page, this) }; if (!ModelState.IsValid) return View(model); diff --git a/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentHandler.cs b/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentHandler.cs index dc9f2a501..b1fce5726 100644 --- a/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentHandler.cs +++ b/src/Orchard.Web/Packages/Orchard.Sandbox/Models/SandboxContentHandler.cs @@ -22,7 +22,7 @@ namespace Orchard.Sandbox.Models { Filters.Add(new ActivatingFilter(SandboxPage.ContentType.Name)); Filters.Add(new ActivatingFilter(SandboxPage.ContentType.Name)); Filters.Add(new StorageFilter(pageRepository) { AutomaticallyCreateMissingRecord = true }); - Filters.Add(new ContentItemTemplates("Summary")); + Filters.Add(new ContentItemTemplates("Items/Sandbox.Page", "Summary")); OnGetItemMetadata((context, page) => { context.Metadata.DisplayText = page.Record.Name; diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Controllers/HomeController.cs b/src/Orchard.Web/Packages/Orchard.Tags/Controllers/HomeController.cs index ae05c1a83..46ef7c9d6 100644 --- a/src/Orchard.Web/Packages/Orchard.Tags/Controllers/HomeController.cs +++ b/src/Orchard.Web/Packages/Orchard.Tags/Controllers/HomeController.cs @@ -102,7 +102,7 @@ namespace Orchard.Tags.Controllers { var tag = _tagService.GetTagByName(tagName); var items = _tagService.GetTaggedContentItems(tag.Id).Select( - ic => _contentManager.BuildDisplayModel(ic, null, "SummaryForSearch")); + ic => _contentManager.BuildDisplayModel(ic, "SummaryForSearch")); var viewModel = new TagsSearchViewModel { TagName = tag.TagName, diff --git a/src/Orchard.Web/Packages/Orchard.Users/Controllers/AdminController.cs b/src/Orchard.Web/Packages/Orchard.Users/Controllers/AdminController.cs index 66408e1b9..c901732b3 100644 --- a/src/Orchard.Web/Packages/Orchard.Users/Controllers/AdminController.cs +++ b/src/Orchard.Web/Packages/Orchard.Users/Controllers/AdminController.cs @@ -13,65 +13,64 @@ using Orchard.Users.ViewModels; namespace Orchard.Users.Controllers { public class AdminController : Controller, IUpdateModel { + private readonly IMembershipService _membershipService; - private readonly IContentManager _contentManager; - private readonly IRepository _userRepository; - private readonly INotifier _notifier; public AdminController( - IMembershipService membershipService, - IContentManager contentManager, - IRepository userRepository, - INotifier notifier) { + IOrchardServices services, + IMembershipService membershipService) { + Services = services; _membershipService = membershipService; - _contentManager = contentManager; - _userRepository = userRepository; - _notifier = notifier; T = NullLocalizer.Instance; } - public IUser CurrentUser { get; set; } - + public IOrchardServices Services { get; set; } public Localizer T { get; set; } - public ActionResult Index() { - var model = new UsersIndexViewModel(); - var users = _contentManager.Query("user") + public ActionResult Index() { + var users = Services.ContentManager + .Query(Models.User.ContentType.Name) .Where(x => x.UserName != null) .List(); - model.Rows = users.Select(x => new UsersIndexViewModel.Row { User = x }).ToList(); + var model = new UsersIndexViewModel { + Rows = users + .Select(x => new UsersIndexViewModel.Row { User = x }) + .ToList() + }; return View(model); } public ActionResult Create() { - var user = _contentManager.New("user"); + var user = Services.ContentManager.New(Models.User.ContentType.Name); var model = new UserCreateViewModel { - EditorModel = _contentManager.BuildEditorModel(user, null) + User = Services.ContentManager.BuildEditorModel(user) }; return View(model); } - [HttpPost] - public ActionResult Create(UserCreateViewModel model) { + [HttpPost, ActionName("Create")] + public ActionResult _Create() { + + var model = new UserCreateViewModel(); + UpdateModel(model); - if (model.Password != model.ConfirmPassword) { - ModelState.AddModelError("ConfirmPassword", T("Password confirmation must match").ToString()); - } - if (ModelState.IsValid == false) { - model.EditorModel = _contentManager.UpdateEditorModel(_contentManager.New("user"), null, this); - return View(model); - } var user = _membershipService.CreateUser(new CreateUserParams( model.UserName, model.Password, model.Email, null, null, true)); - model.EditorModel = _contentManager.UpdateEditorModel(user, null, this); + + model.User = Services.ContentManager.UpdateEditorModel(user, this); + + if (model.Password != model.ConfirmPassword) { + AddModelError("ConfirmPassword", T("Password confirmation must match")); + } + if (ModelState.IsValid == false) { - //TODO: rollback transaction + Services.TransactionManager.Cancel(); return View(model); } @@ -79,29 +78,33 @@ namespace Orchard.Users.Controllers { } public ActionResult Edit(int id) { - var model = new UserEditViewModel { User = _contentManager.Get(id) }; - model.EditorModel = _contentManager.BuildEditorModel(model.User.ContentItem, null); - return View(model); + return View(new UserEditViewModel { + User = Services.ContentManager.BuildEditorModel(id) + }); } - [HttpPost] - public ActionResult Edit(int id, FormCollection input) { - var model = new UserEditViewModel { User = _contentManager.Get(id) }; - model.EditorModel = _contentManager.UpdateEditorModel(model.User.ContentItem, null, this); + [HttpPost, ActionName("Edit")] + public ActionResult _Edit(int id) { + var model = new UserEditViewModel { + User = Services.ContentManager.UpdateEditorModel(id, this) + }; - if (!TryUpdateModel(model, input.ToValueProvider())) { + // apply additional model properties that were posted on form + UpdateModel(model); + + if (!ModelState.IsValid) { + Services.TransactionManager.Cancel(); return View(model); } - _notifier.Information(T("User information updated")); + Services.Notifier.Information(T("User information updated")); return RedirectToAction("Edit", new { id }); } - bool IUpdateModel.TryUpdateModel(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) { return TryUpdateModel(model, prefix, includeProperties, excludeProperties); } - void IUpdateModel.AddModelError(string key, LocalizedString errorMessage) { + public void AddModelError(string key, LocalizedString errorMessage) { ModelState.AddModelError(key, errorMessage.ToString()); } } diff --git a/src/Orchard.Web/Packages/Orchard.Users/Controllers/HomeController.cs b/src/Orchard.Web/Packages/Orchard.Users/Controllers/HomeController.cs deleted file mode 100644 index cb2db4633..000000000 --- a/src/Orchard.Web/Packages/Orchard.Users/Controllers/HomeController.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Web.Mvc; - -namespace Orchard.Users.Controllers { - [HandleError] - public class HomeController : Controller { - public ActionResult Index() { - return View(); - } - } -} diff --git a/src/Orchard.Web/Packages/Orchard.Users/Models/UserHandler.cs b/src/Orchard.Web/Packages/Orchard.Users/Models/UserHandler.cs index 4e6dc7bca..7d4975f90 100644 --- a/src/Orchard.Web/Packages/Orchard.Users/Models/UserHandler.cs +++ b/src/Orchard.Web/Packages/Orchard.Users/Models/UserHandler.cs @@ -12,6 +12,7 @@ namespace Orchard.Users.Models { public UserHandler(IRepository repository) { Filters.Add(new ActivatingFilter("user")); Filters.Add(new StorageFilter(repository)); + Filters.Add(new ContentItemTemplates("Items/Users.User")); } } } diff --git a/src/Orchard.Web/Packages/Orchard.Users/Orchard.Users.csproj b/src/Orchard.Web/Packages/Orchard.Users/Orchard.Users.csproj index 1b39ca31c..03f766cb4 100644 --- a/src/Orchard.Web/Packages/Orchard.Users/Orchard.Users.csproj +++ b/src/Orchard.Web/Packages/Orchard.Users/Orchard.Users.csproj @@ -62,7 +62,6 @@
- @@ -78,10 +77,9 @@ - - + diff --git a/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserCreateViewModel.cs b/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserCreateViewModel.cs index d4a8e4e4e..c5e859350 100644 --- a/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserCreateViewModel.cs +++ b/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserCreateViewModel.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using Orchard.Models.ViewModels; using Orchard.Mvc.ViewModels; +using Orchard.Security; +using Orchard.Users.Models; namespace Orchard.Users.ViewModels { public class UserCreateViewModel : AdminViewModel { @@ -18,6 +20,6 @@ namespace Orchard.Users.ViewModels { [Required, DataType(DataType.Password)] public string ConfirmPassword { get; set; } - public ItemEditorModel EditorModel { get; set; } + public ItemEditorModel User { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserEditViewModel.cs b/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserEditViewModel.cs index ad12f04bd..dd8f70234 100644 --- a/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserEditViewModel.cs +++ b/src/Orchard.Web/Packages/Orchard.Users/ViewModels/UserEditViewModel.cs @@ -7,26 +7,23 @@ using Orchard.Users.Models; namespace Orchard.Users.ViewModels { public class UserEditViewModel : AdminViewModel { - public User User { get; set; } - public ItemEditorModel EditorModel { get; set; } - - [HiddenInput(DisplayValue = false)] public int Id { - get { return User.Id; } + get { return User.Item.Id; } } [Required] public string UserName { - get { return User.As().Record.UserName; } - set { User.As().Record.UserName = value; } + get { return User.Item.Record.UserName; } + set { User.Item.Record.UserName = value; } } [Required] public string Email { - get { return User.As().Record.Email; } - set { User.As().Record.Email = value; } + get { return User.Item.Record.Email; } + set { User.Item.Record.Email = value; } } + public ItemEditorModel User { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Create.aspx b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Create.aspx index 4ac6d7a42..82dce5fcb 100644 --- a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Create.aspx +++ b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Create.aspx @@ -1,11 +1,16 @@ <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> + <%@ Import Namespace="Orchard.Security" %> <%@ Import Namespace="Orchard.Mvc.Html" %>

Add User

<%using (Html.BeginForm()) { %> - <%= Html.ValidationSummary() %> - <%= Html.EditorForModel() %> + <%=Html.ValidationSummary() %> + <%=Html.EditorFor(m=>m.UserName, "inputTextLarge") %> + <%=Html.EditorFor(m=>m.Email, "inputTextLarge") %> + <%=Html.EditorFor(m=>m.Password, "inputPasswordLarge") %> + <%=Html.EditorFor(m=>m.ConfirmPassword, "inputPasswordLarge") %> + <%=Html.EditorForItem(Model.User) %>
-<% } %> \ No newline at end of file +<% } %> diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Edit.aspx b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Edit.aspx index 8e2776637..9b8823658 100644 --- a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Edit.aspx +++ b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/Edit.aspx @@ -1,12 +1,16 @@ <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> + <%@ Import Namespace="Orchard.Security" %> <%@ Import Namespace="Orchard.Mvc.Html" %> -

Edit User

+

+ Edit User

<%using (Html.BeginForm()) { %> -
    - <%= Html.ValidationSummary() %> - <%= Html.EditorForModel() %> -
    - -
    -<% } %> \ No newline at end of file +<%=Html.ValidationSummary() %> +<%=Html.EditorFor(m=>m.Id) %> +<%=Html.EditorFor(m=>m.UserName, "inputTextLarge") %> +<%=Html.EditorFor(m=>m.Email, "inputTextLarge") %> +<%=Html.EditorForItem(Model.User) %> +
    + +
    +<% } %> diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserCreateViewModel.ascx b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserCreateViewModel.ascx deleted file mode 100644 index cabd0a41a..000000000 --- a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserCreateViewModel.ascx +++ /dev/null @@ -1,11 +0,0 @@ -<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> -<%@ Import Namespace="Orchard.Utility" %> - <%=Html.EditorFor(m=>m.UserName, "inputTextLarge") %> - <%=Html.EditorFor(m=>m.Email, "inputTextLarge") %> - <%=Html.EditorFor(m=>m.Password, "inputPasswordLarge") %> - <%=Html.EditorFor(m=>m.ConfirmPassword, "inputPasswordLarge") %> -<% -foreach(var e in Model.EditorModel.Editors) { - var editor = e;%> - <%=Html.EditorFor(m => editor.Model, editor.TemplateName, editor.Prefix)%> -<% } %> diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserEditViewModel.ascx b/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserEditViewModel.ascx deleted file mode 100644 index 2ab94b63e..000000000 --- a/src/Orchard.Web/Packages/Orchard.Users/Views/Admin/EditorTemplates/UserEditViewModel.ascx +++ /dev/null @@ -1,8 +0,0 @@ -<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> -<%@ Import Namespace="Orchard.Utility" %> - <%=Html.EditorFor(m=>m.Id) %> - <%=Html.EditorFor(m=>m.UserName, "inputTextLarge") %> - <%=Html.EditorFor(m=>m.Email, "inputTextLarge") %> -<% foreach(var e in Model.EditorModel.Editors) {%> - <%=Html.EditorFor(m => e.Model, e.TemplateName, e.Prefix)%> -<%} %> diff --git a/src/Orchard.Web/Packages/Orchard.Users/Views/EditorTemplates/Items/Users.User.ascx b/src/Orchard.Web/Packages/Orchard.Users/Views/EditorTemplates/Items/Users.User.ascx new file mode 100644 index 000000000..7fa3d7749 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Users/Views/EditorTemplates/Items/Users.User.ascx @@ -0,0 +1,5 @@ +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl>" %> +<%@ Import Namespace="Orchard.Mvc.Html" %> +<%@ Import Namespace="Orchard.Models.ViewModels" %> +<%@ Import Namespace="Orchard.Users.Models" %> +<%=Html.EditorZonesAny() %> diff --git a/src/Orchard.Web/Themes/BlueSky/Views/layout.ascx b/src/Orchard.Web/Themes/BlueSky/Views/layout.ascx new file mode 100644 index 000000000..8111bdf2c --- /dev/null +++ b/src/Orchard.Web/Themes/BlueSky/Views/layout.ascx @@ -0,0 +1,16 @@ +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Mvc.ViewModels"%> +<%@ Import Namespace="Orchard.Mvc.Html" %> + +<% Html.RegisterStyle(ResolveUrl("~/Themes/BlueSky/Styles/site.css")); %> + +
    + +
    + <%Html.Zone("content", () => Html.RenderBody() );%> + +
    +
    \ No newline at end of file diff --git a/src/Orchard.Web/Themes/TheAdmin/Views/Shared/layout.ascx b/src/Orchard.Web/Themes/TheAdmin/Views/layout.ascx similarity index 100% rename from src/Orchard.Web/Themes/TheAdmin/Views/Shared/layout.ascx rename to src/Orchard.Web/Themes/TheAdmin/Views/layout.ascx diff --git a/src/Orchard/Data/HackSessionLocator.cs b/src/Orchard/Data/HackSessionLocator.cs index dad642adf..28ed85f57 100644 --- a/src/Orchard/Data/HackSessionLocator.cs +++ b/src/Orchard/Data/HackSessionLocator.cs @@ -78,7 +78,7 @@ namespace Orchard.Data { public void Dispose() { if (_session != null) { - _session.Flush(); + //_session.Flush(); _session.Close(); } } diff --git a/src/Orchard/Data/TransactionManager.cs b/src/Orchard/Data/TransactionManager.cs new file mode 100644 index 000000000..0e8566728 --- /dev/null +++ b/src/Orchard/Data/TransactionManager.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Transactions; +using System.Web.Mvc; +using Orchard.Mvc.Filters; + +namespace Orchard.Data { + public interface ITransactionManager : IDependency { + void Cancel(); + } + + public class TransactionManager : ITransactionManager, IDisposable { + private readonly TransactionScope _scope; + private bool _cancelled; + + public TransactionManager() { + _scope = new TransactionScope(TransactionScopeOption.Required); + } + + void IDisposable.Dispose() { + if (!_cancelled) + _scope.Complete(); + _scope.Dispose(); + } + + void ITransactionManager.Cancel() { + _cancelled = true; + } + } + + public class TransactionFilter : FilterProvider, IExceptionFilter{ + private readonly ITransactionManager _transactionManager; + + public TransactionFilter(ITransactionManager transactionManager) { + _transactionManager = transactionManager; + } + + public void OnException(ExceptionContext filterContext) { + _transactionManager.Cancel(); + } + } +} diff --git a/src/Orchard/Environment/DefaultOrchardHost.cs b/src/Orchard/Environment/DefaultOrchardHost.cs index 7c5cf6a62..4461ac120 100644 --- a/src/Orchard/Environment/DefaultOrchardHost.cs +++ b/src/Orchard/Environment/DefaultOrchardHost.cs @@ -5,6 +5,7 @@ using Autofac.Builder; using Autofac.Integration.Web; using System.Collections.Generic; using Orchard.Mvc; +using Orchard.Mvc.ViewEngines; namespace Orchard.Environment { public class DefaultOrchardHost : IOrchardHost { @@ -36,6 +37,7 @@ namespace Orchard.Environment { shell.Activate(); _current = shell; + ViewEngines.Engines.Insert(0, new LayoutViewEngine(null)); _controllerBuilder.SetControllerFactory(new OrchardControllerFactory()); ServiceLocator.SetLocator(t=>_containerProvider.RequestContainer.Resolve(t)); } diff --git a/src/Orchard/Environment/DefaultOrchardShell.cs b/src/Orchard/Environment/DefaultOrchardShell.cs index dd9e6a32a..2d9689893 100644 --- a/src/Orchard/Environment/DefaultOrchardShell.cs +++ b/src/Orchard/Environment/DefaultOrchardShell.cs @@ -39,40 +39,40 @@ namespace Orchard.Environment { public ILogger Logger { get; set; } - static IEnumerable OrchardLocationFormats() { - return new[] { - "~/Packages/{2}/Views/{1}/{0}.aspx", - "~/Packages/{2}/Views/{1}/{0}.ascx", - "~/Packages/{2}/Views/Shared/{0}.aspx", - "~/Packages/{2}/Views/Shared/{0}.ascx", - "~/Core/{2}/Views/{1}/{0}.aspx", - "~/Core/{2}/Views/{1}/{0}.ascx", - "~/Core/{2}/Views/Shared/{0}.aspx", - "~/Core/{2}/Views/Shared/{0}.ascx", - }; - } + //static IEnumerable OrchardLocationFormats() { + // return new[] { + // "~/Packages/{2}/Views/{1}/{0}.aspx", + // "~/Packages/{2}/Views/{1}/{0}.ascx", + // "~/Packages/{2}/Views/Shared/{0}.aspx", + // "~/Packages/{2}/Views/Shared/{0}.ascx", + // "~/Core/{2}/Views/{1}/{0}.aspx", + // "~/Core/{2}/Views/{1}/{0}.ascx", + // "~/Core/{2}/Views/Shared/{0}.aspx", + // "~/Core/{2}/Views/Shared/{0}.ascx", + // }; + //} public void Activate() { _routePublisher.Publish(_routeProviders.SelectMany(provider => provider.GetRoutes())); _modelBinderPublisher.Publish(_modelBinderProviders.SelectMany(provider => provider.GetModelBinders())); - var viewEngine = _viewEngines.OfType().Single(); - viewEngine.AreaViewLocationFormats = OrchardLocationFormats() - .Concat(viewEngine.AreaViewLocationFormats) - .Distinct() - .ToArray(); - viewEngine.AreaPartialViewLocationFormats = OrchardLocationFormats() - .Concat(viewEngine.AreaPartialViewLocationFormats) - .Distinct() - .ToArray(); + //var viewEngine = _viewEngines.OfType().Single(); + //viewEngine.AreaViewLocationFormats = OrchardLocationFormats() + // .Concat(viewEngine.AreaViewLocationFormats) + // .Distinct() + // .ToArray(); + //viewEngine.AreaPartialViewLocationFormats = OrchardLocationFormats() + // .Concat(viewEngine.AreaPartialViewLocationFormats) + // .Distinct() + // .ToArray(); - var activePackageDescriptors = _extensionManager.ActiveExtensions().Select(x => x.Descriptor); - var sharedLocationFormats = activePackageDescriptors.Select(x => ModelsLocationFormat(x)); - viewEngine.PartialViewLocationFormats = sharedLocationFormats - .Concat(viewEngine.PartialViewLocationFormats) - .Distinct() - .ToArray(); + //var activePackageDescriptors = _extensionManager.ActiveExtensions().Select(x => x.Descriptor); + //var sharedLocationFormats = activePackageDescriptors.Select(x => ModelsLocationFormat(x)); + //viewEngine.PartialViewLocationFormats = sharedLocationFormats + // .Concat(viewEngine.PartialViewLocationFormats) + // .Distinct() + // .ToArray(); _events.Invoke(x => x.Activated(), Logger); } diff --git a/src/Orchard/Environment/OrchardServices.cs b/src/Orchard/Environment/OrchardServices.cs new file mode 100644 index 000000000..cc72d670f --- /dev/null +++ b/src/Orchard/Environment/OrchardServices.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using JetBrains.Annotations; +using Orchard.Data; +using Orchard.Models; +using Orchard.Security; +using Orchard.UI.Notify; + +namespace Orchard.Environment { + [UsedImplicitly] + public class OrchardServices : IOrchardServices { + public OrchardServices( + IContentManager contentManager, + ITransactionManager transactionManager, + IAuthorizer authorizer, + INotifier notifier) { + ContentManager = contentManager; + TransactionManager = transactionManager; + Authorizer = authorizer; + Notifier = notifier; + } + public IContentManager ContentManager { get; set; } + public ITransactionManager TransactionManager {get;set;} + public IAuthorizer Authorizer { get; set; } + public INotifier Notifier { get; set; } + } +} diff --git a/src/Orchard/IOrchardServices.cs b/src/Orchard/IOrchardServices.cs new file mode 100644 index 000000000..1898f3fdc --- /dev/null +++ b/src/Orchard/IOrchardServices.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Orchard.Data; +using Orchard.Models; +using Orchard.Security; +using Orchard.UI.Notify; + +namespace Orchard { + public interface IOrchardServices : IDependency { + IContentManager ContentManager { get; } + ITransactionManager TransactionManager { get; } + IAuthorizer Authorizer { get; set; } + INotifier Notifier { get; } + } +} diff --git a/src/Orchard/Models/ContentExtensions.cs b/src/Orchard/Models/ContentExtensions.cs index 7759d38be..a6f619e1d 100644 --- a/src/Orchard/Models/ContentExtensions.cs +++ b/src/Orchard/Models/ContentExtensions.cs @@ -1,11 +1,16 @@ using System; using System.Collections.Generic; using System.Linq; +using Orchard.Models.Driver; using Orchard.Models.Records; +using Orchard.Models.ViewModels; namespace Orchard.Models { public static class ContentExtensions { + + /* Item creation and accessing extension methods */ + public static T New(this IContentManager manager, string contentType) where T : class, IContent { var contentItem = manager.New(contentType); if (contentItem == null) @@ -18,6 +23,10 @@ namespace Orchard.Models { return part; } + public static T Create(this IContentManager manager, string contentType) where T : class, IContent { + return manager.Create(contentType, init => { }); + } + public static T Create(this IContentManager manager, string contentType, Action initialize) where T : class, IContent { var content = manager.New(contentType); if (content == null) @@ -34,6 +43,23 @@ namespace Orchard.Models { } + /* Display and editor convenience extension methods */ + + public static ItemDisplayModel BuildDisplayModel(this IContentManager manager, int id, string displayType) where T : class, IContent { + return manager.BuildDisplayModel(manager.Get(id), displayType); + } + + public static ItemEditorModel BuildEditorModel(this IContentManager manager, int id) where T : class, IContent { + return manager.BuildEditorModel(manager.Get(id)); + } + + public static ItemEditorModel UpdateEditorModel(this IContentManager manager, int id, IUpdateModel updater) where T : class, IContent { + return manager.UpdateEditorModel(manager.Get(id), updater); + } + + + /* Query related extension methods */ + public static IContentQuery Query(this IContentManager manager) where TPart : ContentPart { return manager.Query().ForPart(); @@ -69,6 +95,7 @@ namespace Orchard.Models { } + /* Aggregate item/part type casting extension methods */ public static bool Is(this IContent content) { return content == null ? false : content.ContentItem.Has(typeof(T)); diff --git a/src/Orchard/Models/DefaultContentManager.cs b/src/Orchard/Models/DefaultContentManager.cs index 549970b92..9734c78bf 100644 --- a/src/Orchard/Models/DefaultContentManager.cs +++ b/src/Orchard/Models/DefaultContentManager.cs @@ -136,13 +136,9 @@ namespace Orchard.Models { return context.Metadata; } - public ItemDisplayModel BuildDisplayModel(TContentPart content, string groupName, string displayType) where TContentPart : IContent { - return BuildDisplayModel(content, groupName, displayType, null); - } - - public ItemDisplayModel BuildDisplayModel(TContent content, string groupName, string displayType, string templatePath) where TContent : IContent { - var itemView = new ItemDisplayModel { Item = content, Displays = Enumerable.Empty() }; - var context = new BuildDisplayModelContext(itemView, groupName, displayType, templatePath); + public ItemDisplayModel BuildDisplayModel(TContentPart content, string displayType) where TContentPart : IContent { + var itemView = new ItemDisplayModel {Item = content, Displays = Enumerable.Empty()}; + var context = new BuildDisplayModelContext(itemView, displayType); foreach (var handler in Handlers) { handler.BuildDisplayModel(context); } @@ -150,13 +146,9 @@ namespace Orchard.Models { return itemView; } - public ItemEditorModel BuildEditorModel(TContent content, string groupName) where TContent : IContent { - return BuildEditorModel(content, groupName, null); - } - - public ItemEditorModel BuildEditorModel(TContent content, string groupName, string templatePath) where TContent : IContent { - var itemView = new ItemEditorModel { Item = content, Editors = Enumerable.Empty() }; - var context = new BuildEditorModelContext(itemView, groupName, templatePath); + public ItemEditorModel BuildEditorModel(TContentPart content) where TContentPart : IContent { + var itemView = new ItemEditorModel { Item = content, Editors = Enumerable.Empty() }; + var context = new BuildEditorModelContext(itemView); foreach (var handler in Handlers) { handler.BuildEditorModel(context); } @@ -164,13 +156,10 @@ namespace Orchard.Models { return itemView; } - public ItemEditorModel UpdateEditorModel(TContent content, string groupName, IUpdateModel updater) where TContent : IContent { - return UpdateEditorModel(content, groupName, updater, null); - } + public ItemEditorModel UpdateEditorModel(TContentPart content, IUpdateModel updater) where TContentPart : IContent { + var itemView = new ItemEditorModel { Item = content, Editors = Enumerable.Empty() }; - public ItemEditorModel UpdateEditorModel(TContent content, string groupName, IUpdateModel updater, string templatePath) where TContent : IContent { - var itemView = new ItemEditorModel { Item = content, Editors = Enumerable.Empty() }; - var context = new UpdateEditorModelContext(itemView, groupName, updater, templatePath); + var context = new UpdateEditorModelContext(itemView, updater); foreach (var handler in Handlers) { handler.UpdateEditorModel(context); } diff --git a/src/Orchard/Models/Driver/BuildDisplayModelContext.cs b/src/Orchard/Models/Driver/BuildDisplayModelContext.cs index a0a7d1166..f43322bed 100644 --- a/src/Orchard/Models/Driver/BuildDisplayModelContext.cs +++ b/src/Orchard/Models/Driver/BuildDisplayModelContext.cs @@ -3,19 +3,15 @@ using Orchard.Models.ViewModels; namespace Orchard.Models.Driver { public class BuildDisplayModelContext { - public BuildDisplayModelContext(ItemDisplayModel displayModel, string groupName, string displayType, string templatePath) { - ContentItem = displayModel.Item; - GroupName = groupName; + public BuildDisplayModelContext(ItemDisplayModel displayModel, string displayType) { + ContentItem = displayModel.Item; DisplayType = displayType; DisplayModel = displayModel; - TemplatePath = templatePath; } public ContentItem ContentItem { get; private set; } - public string GroupName { get; private set; } public string DisplayType { get; private set; } public ItemDisplayModel DisplayModel { get; private set; } - public string TemplatePath { get; private set; } public void AddDisplay(TemplateViewModel display) { DisplayModel.Displays = DisplayModel.Displays.Concat(new[] { display }); diff --git a/src/Orchard/Models/Driver/BuildEditorModelContext.cs b/src/Orchard/Models/Driver/BuildEditorModelContext.cs index 3dd37c5b0..e941598b5 100644 --- a/src/Orchard/Models/Driver/BuildEditorModelContext.cs +++ b/src/Orchard/Models/Driver/BuildEditorModelContext.cs @@ -3,17 +3,13 @@ using Orchard.Models.ViewModels; namespace Orchard.Models.Driver { public class BuildEditorModelContext { - public BuildEditorModelContext(ItemEditorModel editorModel, string groupName, string templatePath) { - ContentItem = editorModel.Item; - GroupName = groupName; + public BuildEditorModelContext(ItemEditorModel editorModel) { + ContentItem = editorModel.Item; EditorModel = editorModel; - TemplatePath = templatePath; } - public ContentItem ContentItem { get; private set; } - public string GroupName { get; private set; } - public ItemEditorModel EditorModel { get; private set; } - public string TemplatePath { get; private set; } + public ContentItem ContentItem { get; set; } + public ItemEditorModel EditorModel { get; set; } public void AddEditor(TemplateViewModel editor) { EditorModel.Editors = EditorModel.Editors.Concat(new[] { editor }); diff --git a/src/Orchard/Models/Driver/ContentItemTemplates.cs b/src/Orchard/Models/Driver/ContentItemTemplates.cs index 956567eb2..1282cbba2 100644 --- a/src/Orchard/Models/Driver/ContentItemTemplates.cs +++ b/src/Orchard/Models/Driver/ContentItemTemplates.cs @@ -5,19 +5,29 @@ using Orchard.Models.ViewModels; namespace Orchard.Models.Driver { public class ContentItemTemplates : TemplateFilterBase where TContent : class, IContent { + private readonly string _templateName; // todo: (heskew) use _prefix? private readonly string _prefix; private readonly string[] _displayTypes; private Action> _updater; - public ContentItemTemplates(params string[] displayTypes) { - _displayTypes = displayTypes; + public ContentItemTemplates(string templateName) + : this(templateName, "") { + + } + + public ContentItemTemplates(string templateName, string displayTypes) { + _templateName = templateName; + _displayTypes = (displayTypes ?? "").Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); _updater = (context, viewModel) => context.Updater.TryUpdateModel(viewModel, "", null, null); } protected override void BuildDisplayModel(BuildDisplayModelContext context, TContent instance) { + context.DisplayModel.TemplateName = _templateName; var longestMatch = LongestMatch(context.DisplayType); - context.DisplayModel.TemplateName = (!string.IsNullOrEmpty(context.TemplatePath) ? context.TemplatePath : typeof(TContent).Name) + "/" + longestMatch; + if (!string.IsNullOrEmpty(longestMatch)) + context.DisplayModel.TemplateName += "." + longestMatch; + context.DisplayModel.Prefix = _prefix; if (context.DisplayModel.GetType() != typeof(ItemDisplayModel)) { @@ -45,7 +55,7 @@ namespace Orchard.Models.Driver { } protected override void BuildEditorModel(BuildEditorModelContext context, TContent instance) { - context.EditorModel.TemplateName = (!string.IsNullOrEmpty(context.TemplatePath) ? context.TemplatePath : typeof(TContent).Name) + "/Detail"; + context.EditorModel.TemplateName = _templateName; context.EditorModel.Prefix = _prefix; if (context.EditorModel.GetType() != typeof(ItemEditorModel)) { context.EditorModel.Adaptor = (html, viewModel) => { @@ -62,7 +72,7 @@ namespace Orchard.Models.Driver { _updater(context, (ItemEditorModel)context.EditorModel); else _updater(context, new ItemEditorModel(context.EditorModel)); - context.EditorModel.TemplateName = (!string.IsNullOrEmpty(context.TemplatePath) ? context.TemplatePath : typeof(TContent).Name) + "/Detail"; + context.EditorModel.TemplateName = _templateName; context.EditorModel.Prefix = _prefix; } diff --git a/src/Orchard/Models/Driver/UpdateEditorModelContext.cs b/src/Orchard/Models/Driver/UpdateEditorModelContext.cs index 4c37dd1ab..fb2156c50 100644 --- a/src/Orchard/Models/Driver/UpdateEditorModelContext.cs +++ b/src/Orchard/Models/Driver/UpdateEditorModelContext.cs @@ -2,8 +2,8 @@ using Orchard.Models.ViewModels; namespace Orchard.Models.Driver { public class UpdateEditorModelContext : BuildEditorModelContext { - public UpdateEditorModelContext(ItemEditorModel editorModel, string groupName, IUpdateModel updater, string templatePath) - : base(editorModel, groupName, templatePath) { + public UpdateEditorModelContext(ItemEditorModel editorModel, IUpdateModel updater) + : base(editorModel) { Updater = updater; } diff --git a/src/Orchard/Models/IContentManager.cs b/src/Orchard/Models/IContentManager.cs index a316cc0f1..2be0e2f27 100644 --- a/src/Orchard/Models/IContentManager.cs +++ b/src/Orchard/Models/IContentManager.cs @@ -15,11 +15,8 @@ namespace Orchard.Models { ContentItemMetadata GetItemMetadata(IContent contentItem); - ItemDisplayModel BuildDisplayModel(TContent content, string groupName, string displayType) where TContent : IContent; - ItemDisplayModel BuildDisplayModel(TContent content, string groupName, string displayType, string templatePath) where TContent : IContent; - ItemEditorModel BuildEditorModel(TContent content, string groupName) where TContent : IContent; - ItemEditorModel BuildEditorModel(TContent content, string groupName, string templatePath) where TContent : IContent; - ItemEditorModel UpdateEditorModel(TContent content, string groupName, IUpdateModel updater) where TContent : IContent; - ItemEditorModel UpdateEditorModel(TContent content, string groupName, IUpdateModel updater, string templatePath) where TContent : IContent; + ItemDisplayModel BuildDisplayModel(TContent content, string displayType) where TContent : IContent; + ItemEditorModel BuildEditorModel(TContent content) where TContent : IContent; + ItemEditorModel UpdateEditorModel(TContent content, IUpdateModel updater) where TContent : IContent; } } diff --git a/src/Orchard/Models/PartDriver.cs b/src/Orchard/Models/PartDriver.cs index 6c4612691..ccb75dede 100644 --- a/src/Orchard/Models/PartDriver.cs +++ b/src/Orchard/Models/PartDriver.cs @@ -17,28 +17,28 @@ namespace Orchard.Models { public abstract class PartDriver : IPartDriver where TPart : class, IContent { DriverResult IPartDriver.BuildDisplayModel(BuildDisplayModelContext context) { var part = context.ContentItem.As(); - return part == null ? null : Display(part, context.GroupName, context.DisplayType); + return part == null ? null : Display(part, context.DisplayType); } DriverResult IPartDriver.BuildEditorModel(BuildEditorModelContext context) { var part = context.ContentItem.As(); - return part == null ? null : Editor(part, context.GroupName); + return part == null ? null : Editor(part); } DriverResult IPartDriver.UpdateEditorModel(UpdateEditorModelContext context) { var part = context.ContentItem.As(); - return part == null ? null : Editor(part, context.GroupName, context.Updater); + return part == null ? null : Editor(part, context.Updater); } - protected virtual DriverResult Display(TPart part, string groupName, string displayType) { + protected virtual DriverResult Display(TPart part, string displayType) { return null; } - protected virtual DriverResult Editor(TPart part, string groupName) { + protected virtual DriverResult Editor(TPart part) { return null; } - protected virtual DriverResult Editor(TPart part, string groupName, IUpdateModel updater) { + protected virtual DriverResult Editor(TPart part, IUpdateModel updater) { return null; } @@ -62,13 +62,13 @@ namespace Orchard.Models { return (typeof (TPart).Name); } } - protected override DriverResult Display(TPart part, string groupName, string displayType) { + protected override DriverResult Display(TPart part, string displayType) { return PartialView(part); } - protected override DriverResult Editor(TPart part, string groupName) { + protected override DriverResult Editor(TPart part) { return PartialView(part); } - protected override DriverResult Editor(TPart part, string groupName, IUpdateModel updater) { + protected override DriverResult Editor(TPart part, IUpdateModel updater) { updater.TryUpdateModel(part, Prefix, null, null); return PartialView(part); } diff --git a/src/Orchard/Mvc/Html/ItemDisplayExtensions.cs b/src/Orchard/Mvc/Html/ItemDisplayExtensions.cs index 56d41b249..8dc3ac0e3 100644 --- a/src/Orchard/Mvc/Html/ItemDisplayExtensions.cs +++ b/src/Orchard/Mvc/Html/ItemDisplayExtensions.cs @@ -8,13 +8,13 @@ using Orchard.Models.ViewModels; namespace Orchard.Mvc.Html { public static class ItemDisplayExtensions { - public static MvcHtmlString DisplayForItem(this HtmlHelper html, TItemViewModel itemViewModel) where TItemViewModel : ItemDisplayModel { - return html.DisplayForItem(x => itemViewModel); + public static MvcHtmlString DisplayForItem(this HtmlHelper html, TItemModel item) where TItemModel : ItemDisplayModel { + return html.DisplayForItem(x => item); } - public static MvcHtmlString DisplayForItem(this HtmlHelper html, Expression> expression) where TItemViewModel : ItemDisplayModel { + public static MvcHtmlString DisplayForItem(this HtmlHelper html, Expression> expression) where TItemModel : ItemDisplayModel { var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); - var model = (TItemViewModel)metadata.Model; + var model = (TItemModel)metadata.Model; if (model.Adaptor != null) { return model.Adaptor(html, model).DisplayForModel(model.TemplateName, model.Prefix ?? ""); diff --git a/src/Orchard/Mvc/Html/ItemEditorExtensions.cs b/src/Orchard/Mvc/Html/ItemEditorExtensions.cs index c9f58d3ac..b8874c41d 100644 --- a/src/Orchard/Mvc/Html/ItemEditorExtensions.cs +++ b/src/Orchard/Mvc/Html/ItemEditorExtensions.cs @@ -8,15 +8,18 @@ using Orchard.Models.ViewModels; namespace Orchard.Mvc.Html { public static class ItemEditorExtensions { - public static MvcHtmlString EditorForItem(this HtmlHelper html, Expression> expression) where TItemViewModel : ItemEditorModel { + public static MvcHtmlString EditorForItem(this HtmlHelper html, TItemModel item) where TItemModel : ItemEditorModel { + return html.EditorForItem(x => item); + } + public static MvcHtmlString EditorForItem(this HtmlHelper html, Expression> expression) where TItemModel : ItemEditorModel { var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); - var model = (TItemViewModel)metadata.Model; + var model = (TItemModel)metadata.Model; if (model.Adaptor != null) { return model.Adaptor(html, model).EditorForModel(model.TemplateName, model.Prefix ?? ""); } - + return html.EditorFor(expression, model.TemplateName, model.Prefix ?? ""); } diff --git a/src/Orchard/Mvc/ViewEngines/LayoutView.cs b/src/Orchard/Mvc/ViewEngines/LayoutView.cs index 6775f2103..f7c59ff2a 100644 --- a/src/Orchard/Mvc/ViewEngines/LayoutView.cs +++ b/src/Orchard/Mvc/ViewEngines/LayoutView.cs @@ -7,26 +7,29 @@ using System.Web.Mvc; namespace Orchard.Mvc.ViewEngines { public class LayoutView : IView { + private readonly LayoutViewEngine _viewEngine; private ViewEngineResult[] _viewEngineResults; - public LayoutView(ViewEngineResult[] views) { + public LayoutView(LayoutViewEngine viewEngine, ViewEngineResult[] views) { + _viewEngine = viewEngine; _viewEngineResults = views; } public void Render(ViewContext viewContext, TextWriter writer) { + using (_viewEngine.CreateScope(viewContext)) { + var layoutViewContext = LayoutViewContext.From(viewContext); - var layoutViewContext = LayoutViewContext.From(viewContext); - - for (var index = 0; index != _viewEngineResults.Length; ++index) { - var viewEngineResult = _viewEngineResults[index]; - if (index == _viewEngineResults.Length - 1) { - viewEngineResult.View.Render(viewContext, writer); - } - else { - //TEMP: to be replaced with an efficient spooling writer - var childWriter = new StringWriter(); - viewEngineResult.View.Render(viewContext, childWriter); - layoutViewContext.BodyContent = childWriter.ToString(); + for (var index = 0; index != _viewEngineResults.Length; ++index) { + var viewEngineResult = _viewEngineResults[index]; + if (index == _viewEngineResults.Length - 1) { + viewEngineResult.View.Render(viewContext, writer); + } + else { + //TEMP: to be replaced with an efficient spooling writer + var childWriter = new StringWriter(); + viewEngineResult.View.Render(viewContext, childWriter); + layoutViewContext.BodyContent = childWriter.ToString(); + } } } } diff --git a/src/Orchard/Mvc/ViewEngines/LayoutViewEngine.cs b/src/Orchard/Mvc/ViewEngines/LayoutViewEngine.cs index 3edcb9c02..a9649da8b 100644 --- a/src/Orchard/Mvc/ViewEngines/LayoutViewEngine.cs +++ b/src/Orchard/Mvc/ViewEngines/LayoutViewEngine.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Web.Mvc; using Orchard.Mvc.ViewModels; @@ -11,6 +12,11 @@ namespace Orchard.Mvc.ViewEngines { } public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) { + var scope = Scope.From(controllerContext); + if (scope != null && scope.LayoutViewEngine != null) { + return scope.LayoutViewEngine._viewEngines.FindPartialView(controllerContext, partialViewName); + } + return new ViewEngineResult(Enumerable.Empty()); } @@ -20,15 +26,17 @@ namespace Orchard.Mvc.ViewEngines { string masterName, bool useCache) { - // TODO: is there an optimization around useCache for - // this implementation? since IView can't re-execute, maybe not... - - // if action returned a View with explicit master - - // this will bypass the multi-pass layout strategy - if (!string.IsNullOrEmpty(masterName) - || !(controllerContext.Controller.ViewData.Model is BaseViewModel)) + var skipLayoutViewEngine = false; + if (string.IsNullOrEmpty(masterName)==false) + skipLayoutViewEngine = true; + if (!(controllerContext.Controller.ViewData.Model is BaseViewModel)) + skipLayoutViewEngine = true; + if (_viewEngines == null || _viewEngines.Count== 0) + skipLayoutViewEngine = true; + if (skipLayoutViewEngine) return new ViewEngineResult(Enumerable.Empty()); + var bodyView = _viewEngines.FindPartialView(controllerContext, viewName); var layoutView = _viewEngines.FindPartialView(controllerContext, "layout"); var documentView = _viewEngines.FindPartialView(controllerContext, "document"); @@ -36,7 +44,7 @@ namespace Orchard.Mvc.ViewEngines { if (bodyView.View == null || layoutView.View == null || documentView.View == null) { - + var missingTemplatesResult = new ViewEngineResult( (bodyView.SearchedLocations ?? Enumerable.Empty()) .Concat((layoutView.SearchedLocations ?? Enumerable.Empty())) @@ -46,7 +54,7 @@ namespace Orchard.Mvc.ViewEngines { return missingTemplatesResult; } - var view = new LayoutView(new[] { + var view = new LayoutView(this, new[] { bodyView, layoutView, documentView, @@ -56,9 +64,34 @@ namespace Orchard.Mvc.ViewEngines { } public void ReleaseView(ControllerContext controllerContext, IView view) { - var layoutView = (LayoutView) view; + var layoutView = (LayoutView)view; layoutView.ReleaseViews(controllerContext); } + + public IDisposable CreateScope(ViewContext context) { + return new Scope(context) { LayoutViewEngine = this }; + } + + class Scope : IDisposable { + private readonly ControllerContext _context; + private readonly Scope _prior; + + public Scope(ControllerContext context) { + _context = context; + _prior = From(context); + context.HttpContext.Items[typeof(Scope)] = this; + } + + public LayoutViewEngine LayoutViewEngine { get; set; } + + public void Dispose() { + _context.HttpContext.Items[typeof(Scope)] = _prior; + } + + public static Scope From(ControllerContext context) { + return (Scope)context.HttpContext.Items[typeof(Scope)]; + } + } } diff --git a/src/Orchard/Mvc/ViewEngines/ViewEngineFilter.cs b/src/Orchard/Mvc/ViewEngines/ViewEngineFilter.cs index 6826b8273..3309c7482 100644 --- a/src/Orchard/Mvc/ViewEngines/ViewEngineFilter.cs +++ b/src/Orchard/Mvc/ViewEngines/ViewEngineFilter.cs @@ -57,12 +57,11 @@ namespace Orchard.Mvc.ViewEngines { var requestViewEngines = new ViewEngineCollection( themeViewEngines .Concat(packageViewEngines) - .Concat(_viewEngines) .ToArray()); var layoutViewEngine = new LayoutViewEngine(requestViewEngines); - viewResultBase.ViewEngineCollection = new ViewEngineCollection(_viewEngines.ToList()); + viewResultBase.ViewEngineCollection = new ViewEngineCollection(); viewResultBase.ViewEngineCollection.Insert(0, layoutViewEngine); } diff --git a/src/Orchard/Mvc/ViewEngines/WebFormsViewEngineProvider.cs b/src/Orchard/Mvc/ViewEngines/WebFormsViewEngineProvider.cs index be6d7b267..a5ecff38b 100644 --- a/src/Orchard/Mvc/ViewEngines/WebFormsViewEngineProvider.cs +++ b/src/Orchard/Mvc/ViewEngines/WebFormsViewEngineProvider.cs @@ -23,14 +23,15 @@ namespace Orchard.Mvc.ViewEngines { ViewLocationFormats = DisabledFormats, AreaMasterLocationFormats = DisabledFormats, AreaViewLocationFormats = DisabledFormats, + AreaPartialViewLocationFormats=DisabledFormats, }; - // enable /Views/Shared/{partialName} - // enable /Views/Shared/"DisplayTemplates/"+{templateName} - // enable /Views/Shared/"EditorTemplates/+{templateName} + // enable /Views/{partialName} + // enable /Views/"DisplayTemplates/"+{templateName} + // enable /Views/"EditorTemplates/+{templateName} viewEngine.PartialViewLocationFormats = new[] { - parameters.VirtualPath + "/Views/Shared/{0}.ascx", - parameters.VirtualPath + "/Views/Shared/{0}.aspx", + parameters.VirtualPath + "/Views/{0}.ascx", + parameters.VirtualPath + "/Views/{0}.aspx", }; // for "routed" request views... @@ -44,19 +45,29 @@ namespace Orchard.Mvc.ViewEngines { } public IViewEngine CreatePackagesViewEngine(CreatePackagesViewEngineParams parameters) { + var areaFormats = new[] { + "~/Core/{2}/Views/{1}/{0}.ascx", + "~/Core/{2}/Views/{1}/{0}.aspx", + "~/Packages/{2}/Views/{1}/{0}.ascx", + "~/Packages/{2}/Views/{1}/{0}.aspx", + }; + + var universalFormats = parameters.VirtualPaths + .SelectMany(x => new[] { + x + "/Views/{0}.ascx", + x + "/Views/{0}.aspx", + }) + .ToArray(); + var viewEngine = new WebFormViewEngine { MasterLocationFormats = DisabledFormats, - ViewLocationFormats = DisabledFormats, + ViewLocationFormats = universalFormats, + PartialViewLocationFormats = universalFormats, AreaMasterLocationFormats = DisabledFormats, - AreaViewLocationFormats = DisabledFormats, - AreaPartialViewLocationFormats = DisabledFormats, + AreaViewLocationFormats = areaFormats, + AreaPartialViewLocationFormats = areaFormats, }; - viewEngine.PartialViewLocationFormats = parameters.VirtualPaths - .Select(x => x + "/Views/Shared/{0}.ascx") - .Concat(parameters.VirtualPaths.Select(s => s + "/Views/Shared/{0}.aspx")) - .ToArray(); - return viewEngine; } } diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index b03ff4237..da6866ad5 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -66,6 +66,7 @@ 3.5 + 3.5 @@ -122,10 +123,13 @@ + + +