diff --git a/lib/aspnetmvc/System.Web.Mvc.dll b/lib/aspnetmvc/System.Web.Mvc.dll index 98b2e6bf4..559fc31d8 100644 Binary files a/lib/aspnetmvc/System.Web.Mvc.dll and b/lib/aspnetmvc/System.Web.Mvc.dll differ diff --git a/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs b/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs index 29aedc5e4..0d420576d 100644 --- a/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs +++ b/src/Orchard.Tests.Packages/Users/Controllers/AdminControllerTests.cs @@ -91,11 +91,11 @@ namespace Orchard.Tests.Packages.Users.Controllers { _obj = obj; } - public bool ContainsPrefix(ControllerContext controllerContext, string prefix) { + public bool ContainsPrefix( string prefix) { return typeof(T).GetProperties().Any(x => x.Name.StartsWith(prefix)); } - public ValueProviderResult GetValue(ControllerContext controllerContext, string key) { + public ValueProviderResult GetValue( string key) { var property = typeof(T).GetProperty(key); if (property == null) return null; diff --git a/src/Orchard.Web/Global.asax.cs b/src/Orchard.Web/Global.asax.cs index 519a345f7..7f31fee9b 100644 --- a/src/Orchard.Web/Global.asax.cs +++ b/src/Orchard.Web/Global.asax.cs @@ -41,7 +41,7 @@ namespace Orchard.Web { protected void Application_Start() { // This is temporary until MVC2 is officially released. // We want to avoid running against an outdated preview installed in the GAC - CheckMvcVersion(new Version("2.0.41116.0")/*MVC2 Beta file version #*/); + CheckMvcVersion(new Version("2.0.41211.0")/*MVC2 RC file version #*/); RegisterRoutes(RouteTable.Routes); _host = OrchardStarter.CreateHost(MvcSingletons); diff --git a/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogPostController.cs b/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogPostController.cs index 1f99b6e9c..bf53313b0 100644 --- a/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogPostController.cs +++ b/src/Orchard.Web/Packages/Orchard.Blogs/Controllers/BlogPostController.cs @@ -23,11 +23,13 @@ namespace Orchard.Blogs.Controllers { private readonly IBlogPostService _blogPostService; public BlogPostController( + IOrchardServices services, ISessionLocator sessionLocator, IContentManager contentManager, IAuthorizer authorizer, INotifier notifier, IBlogService blogService, IBlogPostService blogPostService) { + Services = services; _sessionLocator = sessionLocator; _contentManager = contentManager; _authorizer = authorizer; @@ -37,6 +39,7 @@ namespace Orchard.Blogs.Controllers { T = NullLocalizer.Instance; } + public IOrchardServices Services { get; set; } private Localizer T { get; set; } //TODO: (erikpo) Should think about moving the slug parameters and get calls and null checks up into a model binder or action filter @@ -151,8 +154,8 @@ namespace Orchard.Blogs.Controllers { return View(model); } - [HttpPost] - public ActionResult Edit(string blogSlug, string postSlug, FormCollection input) { + [HttpPost, ActionName("Edit")] + public ActionResult EditPOST(string blogSlug, string postSlug) { if (!_authorizer.Authorize(Permissions.ModifyPost, T("Couldn't edit blog post"))) return new HttpUnauthorizedResult(); @@ -171,13 +174,15 @@ namespace Orchard.Blogs.Controllers { BlogPost = _contentManager.UpdateEditorModel(post, this) }; - IValueProvider values = input.ToValueProvider(); - TryUpdateModel(model, values); + TryUpdateModel(model); + + if (ModelState.IsValid==false) { + Services.TransactionManager.Cancel(); + return View(model); + } _notifier.Information(T("Blog post information updated.")); - - //TODO: (erikpo) Since the model isn't actually updated yet and it's possible the slug changed I'm getting the slug from input. Lame?!?! - return Redirect(Url.BlogPostEdit(blog.Slug, values.GetValue(ControllerContext, "Slug").AttemptedValue)); + return Redirect(Url.BlogPostEdit(blog.Slug, post.Slug)); } [HttpPost] diff --git a/src/Orchard.Web/Packages/Orchard.Comments/Controllers/AdminController.cs b/src/Orchard.Web/Packages/Orchard.Comments/Controllers/AdminController.cs index f3de20e9a..354f4c6b2 100644 --- a/src/Orchard.Web/Packages/Orchard.Comments/Controllers/AdminController.cs +++ b/src/Orchard.Web/Packages/Orchard.Comments/Controllers/AdminController.cs @@ -111,10 +111,10 @@ namespace Orchard.Comments.Controllers { } [AcceptVerbs(HttpVerbs.Post)] - public ActionResult Create(FormCollection input, string returnUrl) { + public ActionResult Create(string returnUrl) { var viewModel = new CommentsCreateViewModel(); try { - UpdateModel(viewModel, input.ToValueProvider()); + UpdateModel(viewModel); if (CurrentSite.As().Record.RequireLoginToAddComment) { if (!_authorizer.Authorize(Permissions.AddComment, T("Couldn't add comment"))) return new HttpUnauthorizedResult(); diff --git a/src/Orchard.Web/Packages/Orchard.Comments/Controllers/HasCommentsDriver.cs b/src/Orchard.Web/Packages/Orchard.Comments/Controllers/HasCommentsDriver.cs new file mode 100644 index 000000000..d8e319204 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Comments/Controllers/HasCommentsDriver.cs @@ -0,0 +1,30 @@ +using Orchard.Comments.Models; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Drivers; + +namespace Orchard.Comments.Controllers { + public class HasCommentsDriver : PartDriver { + protected override DriverResult Display(HasComments part, string displayType) { + if (part.CommentsShown == false) { + return null; + } + + if (displayType.StartsWith("Detail")) { + return Combined( + PartTemplate(part, "Parts/Comments.Count").Location("body", "above.5"), + PartTemplate(part, "Parts/Comments.HasComments").Location("body", "below.5")); + } + + return PartTemplate(part, "Parts/Comments.HasComments").Location("body", "below.5"); + } + + protected override DriverResult Editor(HasComments part) { + return PartTemplate(part, "Parts/Comments.HasComments"); + } + + protected override DriverResult Editor(HasComments part, IUpdateModel updater) { + updater.TryUpdateModel(part, Prefix, null, null); + return PartTemplate(part, "Parts/Comments.HasComments"); + } + } +} diff --git a/src/Orchard.Web/Packages/Orchard.Comments/Models/CommentsHandler.cs b/src/Orchard.Web/Packages/Orchard.Comments/Models/CommentsHandler.cs index a55bbb078..88262aacd 100644 --- a/src/Orchard.Web/Packages/Orchard.Comments/Models/CommentsHandler.cs +++ b/src/Orchard.Web/Packages/Orchard.Comments/Models/CommentsHandler.cs @@ -1,73 +1,28 @@ -using System; +using JetBrains.Annotations; using Orchard.Data; -using Orchard.ContentManagement; using Orchard.ContentManagement.Handlers; -using Orchard.ContentManagement.ViewModels; -using Orchard.Comments.Services; namespace Orchard.Comments.Models { + [UsedImplicitly] public class HasCommentsHandler : ContentHandler { - private readonly IRepository _commentsRepository; - private readonly IRepository _closedCommentsRepository; - private readonly ICommentService _commentService; + public HasCommentsHandler( + IRepository commentsRepository, + IRepository hasCommentsRepository) { - public HasCommentsHandler(IRepository commentsRepository, IRepository closedCommentsRepository, ICommentService commentService) { - _commentsRepository = commentsRepository; - _closedCommentsRepository = closedCommentsRepository; - _commentService = commentService; Filters.Add(new ActivatingFilter("sandboxpage")); Filters.Add(new ActivatingFilter("blogpost")); + Filters.Add(new StorageFilter(hasCommentsRepository) { AutomaticallyCreateMissingRecord = true }); + + OnActivated((ctx, x) => { + x.CommentsActive = true; + x.CommentsShown = true; + }); + + OnLoading((context, comments) => { + comments.Comments = commentsRepository.Fetch(x => x.CommentedOn == context.ContentItem.Id && x.Status == CommentStatus.Approved); + }); } - protected override void BuildDisplayModel(BuildDisplayModelContext context) { - if (context.ContentItem.Has() == false) { - return; - } - context.AddDisplay(new TemplateViewModel(context.ContentItem.Get()) { TemplateName = "Parts/Comments.Count", ZoneName="body", Position = "above" }); - context.AddDisplay(new TemplateViewModel(context.ContentItem.Get()) { TemplateName = "Parts/Comments.HasComments", Position = "999" }); - } - protected override void BuildEditorModel(BuildEditorModelContext context) { - if (context.ContentItem.Has() == false) { - return; - } - context.AddEditor(new TemplateViewModel(context.ContentItem.Get()) { TemplateName = "Parts/Comments.HasComments" }); - } - - protected override void UpdateEditorModel(UpdateEditorModelContext context) { - if (context.ContentItem.Has() == false) { - return; - } - CommentsViewModel viewModel = new CommentsViewModel(); - context.Updater.TryUpdateModel(viewModel, String.Empty, null, null); - bool closed = viewModel.Closed == null ? false : true; - bool currentStatus = _commentService.CommentsClosedForCommentedContent(context.ContentItem.Id); - if (currentStatus != closed) { - if (closed) { - _commentService.CloseCommentsForCommentedContent(context.ContentItem.Id); - } - else { - _commentService.EnableCommentsForCommentedContent(context.ContentItem.Id); - } - } - - context.AddEditor(new TemplateViewModel(context.ContentItem.Get()) { TemplateName = "Parts/Comments.HasComments" }); - } - - protected override void Loading(LoadContentContext context) { - if (context.ContentItem.Has() == false) { - return; - } - - HasComments comments = context.ContentItem.Get(); - comments.Comments = _commentsRepository.Fetch(x => x.CommentedOn == context.ContentItem.Id && x.Status == CommentStatus.Approved); - if (_closedCommentsRepository.Get(x => x.ContentItemId == context.ContentItem.Id) != null) { - comments.Closed = true; - } - } - - public class CommentsViewModel { - public String Closed { get; set; } - } } } diff --git a/src/Orchard.Web/Packages/Orchard.Comments/Models/HasComments.cs b/src/Orchard.Web/Packages/Orchard.Comments/Models/HasComments.cs index 0e814f236..ab2155ca5 100644 --- a/src/Orchard.Web/Packages/Orchard.Comments/Models/HasComments.cs +++ b/src/Orchard.Web/Packages/Orchard.Comments/Models/HasComments.cs @@ -1,14 +1,29 @@ using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using Orchard.ContentManagement; +using Orchard.ContentManagement.Records; namespace Orchard.Comments.Models { - public class HasComments : ContentPart { - public HasComments() { - Comments = Enumerable.Empty(); - } + public class HasComments : ContentPart { + + public int CommentCount { get { return Comments.Count(); } } public IEnumerable Comments { get; set; } - public bool Closed { get; set; } + + public bool CommentsShown { + get { return Record.CommentsShown; } + set { Record.CommentsShown = value; } + } + + public bool CommentsActive { + get { return Record.CommentsActive; } + set { Record.CommentsActive = value; } + } + } + + public class HasCommentsRecord : ContentPartRecord { + public virtual bool CommentsShown { get; set; } + public virtual bool CommentsActive { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Packages/Orchard.Comments/Orchard.Comments.csproj b/src/Orchard.Web/Packages/Orchard.Comments/Orchard.Comments.csproj index e82617745..4491142b3 100644 --- a/src/Orchard.Web/Packages/Orchard.Comments/Orchard.Comments.csproj +++ b/src/Orchard.Web/Packages/Orchard.Comments/Orchard.Comments.csproj @@ -67,6 +67,7 @@ + @@ -82,6 +83,7 @@ + diff --git a/src/Orchard.Web/Packages/Orchard.Comments/Services/CommentService.cs b/src/Orchard.Web/Packages/Orchard.Comments/Services/CommentService.cs index ab043cd87..f0af9de63 100644 --- a/src/Orchard.Web/Packages/Orchard.Comments/Services/CommentService.cs +++ b/src/Orchard.Web/Packages/Orchard.Comments/Services/CommentService.cs @@ -29,19 +29,22 @@ namespace Orchard.Comments.Services { public class CommentService : ICommentService { private readonly IRepository _commentRepository; private readonly IRepository _closedCommentsRepository; + private readonly IRepository _hasCommentsRepository; private readonly ICommentValidator _commentValidator; private readonly IContentManager _contentManager; private readonly IAuthorizer _authorizer; private readonly INotifier _notifier; - public CommentService(IRepository commentRepository, + public CommentService(IRepository commentRepository, IRepository closedCommentsRepository, + IRepository hasCommentsRepository, ICommentValidator commentValidator, IContentManager contentManager, - IAuthorizer authorizer, + IAuthorizer authorizer, INotifier notifier) { _commentRepository = commentRepository; _closedCommentsRepository = closedCommentsRepository; + _hasCommentsRepository = hasCommentsRepository; _commentValidator = commentValidator; _contentManager = contentManager; _authorizer = authorizer; @@ -51,7 +54,7 @@ namespace Orchard.Comments.Services { public ILogger Logger { get; set; } protected virtual ISite CurrentSite { get; [UsedImplicitly] private set; } - + #region Implementation of ICommentService diff --git a/src/Orchard.Web/Packages/Orchard.Comments/ViewModels/EditCommentsViewModel.cs b/src/Orchard.Web/Packages/Orchard.Comments/ViewModels/EditCommentsViewModel.cs new file mode 100644 index 000000000..dc9370ba4 --- /dev/null +++ b/src/Orchard.Web/Packages/Orchard.Comments/ViewModels/EditCommentsViewModel.cs @@ -0,0 +1,9 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace Orchard.Comments.ViewModels { + public class EditCommentsViewModel { + } +} diff --git a/src/Orchard.Web/Packages/Orchard.Comments/Views/DisplayTemplates/Parts/Comments.Count.ascx b/src/Orchard.Web/Packages/Orchard.Comments/Views/DisplayTemplates/Parts/Comments.Count.ascx index 830e61a3c..b27041687 100644 --- a/src/Orchard.Web/Packages/Orchard.Comments/Views/DisplayTemplates/Parts/Comments.Count.ascx +++ b/src/Orchard.Web/Packages/Orchard.Comments/Views/DisplayTemplates/Parts/Comments.Count.ascx @@ -1,3 +1,3 @@ <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <%@ Import Namespace="Orchard.Comments.Models"%> -<%=Model.Comments.Count() %> Comment<%=Model.Comments.Count() == 1 ? "" : "s" %> +<%=Model.CommentCount %> Comment<%=Model.CommentCount == 1 ? "" : "s" %> diff --git a/src/Orchard.Web/Packages/Orchard.Comments/Views/DisplayTemplates/Parts/Comments.HasComments.ascx b/src/Orchard.Web/Packages/Orchard.Comments/Views/DisplayTemplates/Parts/Comments.HasComments.ascx index 850dcae72..472311626 100644 --- a/src/Orchard.Web/Packages/Orchard.Comments/Views/DisplayTemplates/Parts/Comments.HasComments.ascx +++ b/src/Orchard.Web/Packages/Orchard.Comments/Views/DisplayTemplates/Parts/Comments.HasComments.ascx @@ -1,6 +1,6 @@ <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <%@ Import Namespace="Orchard.Comments.Models"%> -

<%=Model.Comments.Count() %> Comment<%=Model.Comments.Count() == 1 ? "" : "s" %>

<% +

<%=Model.CommentCount %> Comment<%=Model.CommentCount == 1 ? "" : "s" %>

<% foreach (var comment in Model.Comments) { %>
@@ -13,7 +13,7 @@
<% } -if (Model.Closed) { %> +if (Model.CommentsActive == false) { %>

Comments have been disabled for this content.

<% } else { %> <% using(Html.BeginForm("Create", "Admin", new { area = "Orchard.Comments" }, FormMethod.Post, new { @class = "comments" })) { %> @@ -35,4 +35,6 @@ if (Model.Closed) { %> <%=Html.AntiForgeryTokenOrchard() %> <% } -} %> \ No newline at end of file +} %> + + \ No newline at end of file diff --git a/src/Orchard.Web/Packages/Orchard.Comments/Views/EditorTemplates/Parts/Comments.HasComments.ascx b/src/Orchard.Web/Packages/Orchard.Comments/Views/EditorTemplates/Parts/Comments.HasComments.ascx index 1474d718c..ace817aee 100644 --- a/src/Orchard.Web/Packages/Orchard.Comments/Views/EditorTemplates/Parts/Comments.HasComments.ascx +++ b/src/Orchard.Web/Packages/Orchard.Comments/Views/EditorTemplates/Parts/Comments.HasComments.ascx @@ -1,20 +1,21 @@ -<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> -<%@ Import Namespace="Orchard.Comments.Models"%> +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Comments.Models" %>
- Comments<% if (Model.ContentItem.Id != 0) { %>: <% var commentCount = Model.Comments.Count(); %> - <%=Html.ActionLink( + Comments<% if (Model.ContentItem.Id != 0) { %>: + <% + var commentCount = Model.CommentCount; %> + <%=Html.ActionLink( string.Format("{0} comment{1}", commentCount, commentCount == 1 ? "" : "s"), "Details", new { Area = "Orchard.Comments", Controller = "Admin", id = Model.ContentItem.Id, returnUrl = Context.Request.Url } ) %> - - 0 pending<% } %> - + - 0 pending<% } %> + +
- diff --git a/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/ContentController.cs b/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/ContentController.cs index 695bdaea5..76b5aec7e 100644 --- a/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/ContentController.cs +++ b/src/Orchard.Web/Packages/Orchard.DevTools/Controllers/ContentController.cs @@ -36,7 +36,7 @@ namespace Orchard.DevTools.Controllers { .Select(x => x.GetType()) .SelectMany(x => AllTypes(x)) .Distinct(); - model.DisplayModel = _contentManager.BuildDisplayModel(model.Item, null); + model.DisplayModel = _contentManager.BuildDisplayModel(model.Item, "Detail"); model.EditorModel = _contentManager.BuildEditorModel(model.Item); return View(model); diff --git a/src/Orchard.Web/Themes/TheAdmin/Views/layout.ascx b/src/Orchard.Web/Themes/TheAdmin/Views/layout.ascx index a9d45ee71..9d5b5125e 100644 --- a/src/Orchard.Web/Themes/TheAdmin/Views/layout.ascx +++ b/src/Orchard.Web/Themes/TheAdmin/Views/layout.ascx @@ -1,5 +1,7 @@ <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> -<%@ Import Namespace="Orchard.Mvc.ViewModels"%><% +<%@ Import Namespace="Orchard.Mvc.ViewModels"%> +<%@ Import Namespace="Orchard.Mvc.Html"%> +<% Html.RegisterStyle("site.css"); %>