mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Add a FollowReturnUrl attribute to honor ReturnUrl in the querystring
--HG-- branch : dev
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<BodyDisplayViewModel>" %>
|
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<BodyDisplayViewModel>" %>
|
||||||
<%@ Import Namespace="Orchard.Core.Common.ViewModels"%>
|
<%@ Import Namespace="Orchard.Core.Common.ViewModels"%>
|
||||||
<div class="manage">
|
<div class="manage">
|
||||||
<%=Html.ItemEditLink("Edit", Model.BodyAspect.ContentItem) %>
|
<%=Html.ItemEditLinkWithReturnUrl(_Encoded("Edit").ToString(), Model.BodyAspect.ContentItem) %>
|
||||||
</div>
|
</div>
|
@@ -7,6 +7,7 @@ using Orchard.Blogs.ViewModels;
|
|||||||
using Orchard.ContentManagement;
|
using Orchard.ContentManagement;
|
||||||
using Orchard.Localization;
|
using Orchard.Localization;
|
||||||
using Orchard.Mvc.AntiForgery;
|
using Orchard.Mvc.AntiForgery;
|
||||||
|
using Orchard.Mvc.FollowReturnUrl;
|
||||||
using Orchard.Mvc.Results;
|
using Orchard.Mvc.Results;
|
||||||
using Orchard.UI.Admin;
|
using Orchard.UI.Admin;
|
||||||
using Orchard.UI.Notify;
|
using Orchard.UI.Notify;
|
||||||
@@ -100,17 +101,17 @@ namespace Orchard.Blogs.Controllers {
|
|||||||
return View(model);
|
return View(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost, ActionName("Edit")]
|
[HttpPost, ActionName("Edit"), FollowReturnUrl]
|
||||||
public ActionResult EditPOST(string blogSlug, int postId) {
|
public ActionResult EditPOST(string blogSlug, int postId) {
|
||||||
if (!Services.Authorizer.Authorize(Permissions.EditBlogPost, T("Couldn't edit blog post")))
|
if (!Services.Authorizer.Authorize(Permissions.EditBlogPost, T("Couldn't edit blog post")))
|
||||||
return new HttpUnauthorizedResult();
|
return new HttpUnauthorizedResult();
|
||||||
|
|
||||||
Blog blog = _blogService.Get(blogSlug);
|
var blog = _blogService.Get(blogSlug);
|
||||||
if (blog == null)
|
if (blog == null)
|
||||||
return new NotFoundResult();
|
return new NotFoundResult();
|
||||||
|
|
||||||
// Get draft (create a new version if needed)
|
// Get draft (create a new version if needed)
|
||||||
BlogPost post = _blogPostService.Get(postId, VersionOptions.DraftRequired);
|
var post = _blogPostService.Get(postId, VersionOptions.DraftRequired);
|
||||||
if (post == null)
|
if (post == null)
|
||||||
return new NotFoundResult();
|
return new NotFoundResult();
|
||||||
|
|
||||||
|
@@ -7,6 +7,7 @@ using JetBrains.Annotations;
|
|||||||
using Orchard.Localization;
|
using Orchard.Localization;
|
||||||
using Orchard.ContentManagement;
|
using Orchard.ContentManagement;
|
||||||
using Orchard.Mvc.AntiForgery;
|
using Orchard.Mvc.AntiForgery;
|
||||||
|
using Orchard.Mvc.FollowReturnUrl;
|
||||||
using Orchard.Mvc.Results;
|
using Orchard.Mvc.Results;
|
||||||
using Orchard.Pages.Drivers;
|
using Orchard.Pages.Drivers;
|
||||||
using Orchard.Pages.Models;
|
using Orchard.Pages.Models;
|
||||||
@@ -169,9 +170,9 @@ namespace Orchard.Pages.Controllers {
|
|||||||
return View(model);
|
return View(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost, ActionName("Edit")]
|
[HttpPost, ActionName("Edit"), FollowReturnUrl]
|
||||||
public ActionResult EditPOST(int id) {
|
public ActionResult EditPOST(int id) {
|
||||||
Page page = _pageService.GetPageOrDraft(id);
|
var page = _pageService.GetPageOrDraft(id);
|
||||||
if (page == null)
|
if (page == null)
|
||||||
return new NotFoundResult();
|
return new NotFoundResult();
|
||||||
|
|
||||||
@@ -209,7 +210,7 @@ namespace Orchard.Pages.Controllers {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return RedirectToAction("Edit", "Admin", new { id = model.Page.Item.ContentItem.Id });
|
return RedirectToAction("Edit", "Admin", new {id = model.Page.Item.ContentItem.Id});
|
||||||
}
|
}
|
||||||
|
|
||||||
public ActionResult DiscardDraft(int id) {
|
public ActionResult DiscardDraft(int id) {
|
||||||
|
21
src/Orchard/Extensions/RouteValueDictionaryExtensions.cs
Normal file
21
src/Orchard/Extensions/RouteValueDictionaryExtensions.cs
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
using System.Web.Routing;
|
||||||
|
|
||||||
|
namespace Orchard.Extensions {
|
||||||
|
public static class RouteValueDictionaryExtensions {
|
||||||
|
public static RouteValueDictionary Merge(this RouteValueDictionary dictionary, object values) {
|
||||||
|
return values == null ? dictionary : dictionary.Merge(new RouteValueDictionary(values));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RouteValueDictionary Merge(this RouteValueDictionary dictionary, RouteValueDictionary dictionaryToMerge) {
|
||||||
|
if (dictionaryToMerge == null)
|
||||||
|
return dictionary;
|
||||||
|
|
||||||
|
var newDictionary = new RouteValueDictionary(dictionary);
|
||||||
|
|
||||||
|
foreach (var valueDictionary in dictionaryToMerge)
|
||||||
|
newDictionary[valueDictionary.Key] = valueDictionary.Value;
|
||||||
|
|
||||||
|
return newDictionary;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,8 @@
|
|||||||
|
using System;
|
||||||
|
using System.Web.Mvc;
|
||||||
|
|
||||||
|
namespace Orchard.Mvc.FollowReturnUrl {
|
||||||
|
[AttributeUsage(AttributeTargets.Method)]
|
||||||
|
public class FollowReturnUrlAttribute : FilterAttribute {
|
||||||
|
}
|
||||||
|
}
|
42
src/Orchard/Mvc/FollowReturnUrl/FollowReturnUrlFilter.cs
Normal file
42
src/Orchard/Mvc/FollowReturnUrl/FollowReturnUrlFilter.cs
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
using System;
|
||||||
|
using System.Web.Mvc;
|
||||||
|
using Orchard.Mvc.Filters;
|
||||||
|
|
||||||
|
namespace Orchard.Mvc.FollowReturnUrl {
|
||||||
|
public class FollowReturnUrlFilter : FilterProvider, IActionFilter {
|
||||||
|
public void OnActionExecuting(ActionExecutingContext filterContext) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnActionExecuted(ActionExecutedContext filterContext) {
|
||||||
|
var attributes =
|
||||||
|
(FollowReturnUrlAttribute[])
|
||||||
|
filterContext.ActionDescriptor.GetCustomAttributes(typeof (FollowReturnUrlAttribute), false);
|
||||||
|
|
||||||
|
if (attributes.Length <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var request = filterContext.HttpContext.Request;
|
||||||
|
Uri returnUrl = null;
|
||||||
|
try {
|
||||||
|
returnUrl = new Uri(request.QueryString["ReturnUrl"]);
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
try {
|
||||||
|
returnUrl =
|
||||||
|
new Uri(string.Format("{0}://{1}{2}{3}", request.Url.Scheme, request.Url.Host,
|
||||||
|
request.Url.Port != 80 ? ":" + request.Url.Port : "",
|
||||||
|
request.QueryString["ReturnUrl"]));
|
||||||
|
}
|
||||||
|
catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (returnUrl != null &&
|
||||||
|
returnUrl.Scheme == request.Url.Scheme &&
|
||||||
|
returnUrl.Port == request.Url.Port &&
|
||||||
|
returnUrl.Host == request.Url.Host) {
|
||||||
|
filterContext.Result = new RedirectResult(returnUrl.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -2,7 +2,7 @@
|
|||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
using System.Web.Mvc.Html;
|
using System.Web.Mvc.Html;
|
||||||
using Orchard.ContentManagement;
|
using Orchard.ContentManagement;
|
||||||
using Orchard.Mvc.ViewModels;
|
using Orchard.Extensions;
|
||||||
|
|
||||||
namespace Orchard.Mvc.Html {
|
namespace Orchard.Mvc.Html {
|
||||||
public static class ContentItemExtensions {
|
public static class ContentItemExtensions {
|
||||||
@@ -29,7 +29,15 @@ namespace Orchard.Mvc.Html {
|
|||||||
return ItemDisplayLink(html, null, content);
|
return ItemDisplayLink(html, null, content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MvcHtmlString ItemEditLinkWithReturnUrl(this HtmlHelper html, string linkText, IContent content) {
|
||||||
|
return html.ItemEditLink(linkText, content, new {ReturnUrl = html.ViewContext.HttpContext.Request.RawUrl});
|
||||||
|
}
|
||||||
|
|
||||||
public static MvcHtmlString ItemEditLink(this HtmlHelper html, string linkText, IContent content) {
|
public static MvcHtmlString ItemEditLink(this HtmlHelper html, string linkText, IContent content) {
|
||||||
|
return html.ItemEditLink(linkText, content, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MvcHtmlString ItemEditLink(this HtmlHelper html, string linkText, IContent content, object additionalRouteValues) {
|
||||||
var metadata = content.ContentItem.ContentManager.GetItemMetadata(content);
|
var metadata = content.ContentItem.ContentManager.GetItemMetadata(content);
|
||||||
if (metadata.EditorRouteValues == null)
|
if (metadata.EditorRouteValues == null)
|
||||||
return null;
|
return null;
|
||||||
@@ -37,7 +45,7 @@ namespace Orchard.Mvc.Html {
|
|||||||
return html.ActionLink(
|
return html.ActionLink(
|
||||||
linkText ?? metadata.DisplayText ?? "edit",
|
linkText ?? metadata.DisplayText ?? "edit",
|
||||||
Convert.ToString(metadata.EditorRouteValues["action"]),
|
Convert.ToString(metadata.EditorRouteValues["action"]),
|
||||||
metadata.EditorRouteValues);
|
metadata.EditorRouteValues.Merge(additionalRouteValues));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MvcHtmlString ItemEditLink(this HtmlHelper html, IContent content) {
|
public static MvcHtmlString ItemEditLink(this HtmlHelper html, IContent content) {
|
||||||
|
@@ -231,7 +231,7 @@ namespace Orchard.Mvc.Html {
|
|||||||
#region BeginFormAntiForgeryPost
|
#region BeginFormAntiForgeryPost
|
||||||
|
|
||||||
public static MvcForm BeginFormAntiForgeryPost(this HtmlHelper htmlHelper) {
|
public static MvcForm BeginFormAntiForgeryPost(this HtmlHelper htmlHelper) {
|
||||||
return htmlHelper.BeginFormAntiForgeryPost(htmlHelper.ViewContext.HttpContext.Request.Url.AbsolutePath, FormMethod.Post, new RouteValueDictionary());
|
return htmlHelper.BeginFormAntiForgeryPost(htmlHelper.ViewContext.HttpContext.Request.Url.PathAndQuery, FormMethod.Post, new RouteValueDictionary());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MvcForm BeginFormAntiForgeryPost(this HtmlHelper htmlHelper, string formAction) {
|
public static MvcForm BeginFormAntiForgeryPost(this HtmlHelper htmlHelper, string formAction) {
|
||||||
@@ -247,7 +247,7 @@ namespace Orchard.Mvc.Html {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static MvcForm BeginFormAntiForgeryPost(this HtmlHelper htmlHelper, string formAction, FormMethod formMethod, IDictionary<string, object> htmlAttributes) {
|
public static MvcForm BeginFormAntiForgeryPost(this HtmlHelper htmlHelper, string formAction, FormMethod formMethod, IDictionary<string, object> htmlAttributes) {
|
||||||
TagBuilder tagBuilder = new TagBuilder("form");
|
var tagBuilder = new TagBuilder("form");
|
||||||
|
|
||||||
tagBuilder.MergeAttributes(htmlAttributes);
|
tagBuilder.MergeAttributes(htmlAttributes);
|
||||||
tagBuilder.MergeAttribute("action", formAction);
|
tagBuilder.MergeAttribute("action", formAction);
|
||||||
|
@@ -151,12 +151,15 @@
|
|||||||
<Compile Include="Environment\StandaloneEnvironment.cs" />
|
<Compile Include="Environment\StandaloneEnvironment.cs" />
|
||||||
<Compile Include="Extensions\AreaFolders.cs" />
|
<Compile Include="Extensions\AreaFolders.cs" />
|
||||||
<Compile Include="Extensions\ExtensionFolders.cs" />
|
<Compile Include="Extensions\ExtensionFolders.cs" />
|
||||||
|
<Compile Include="Extensions\RouteValueDictionaryExtensions.cs" />
|
||||||
<Compile Include="Extensions\Loaders\AreaExtensionLoader.cs" />
|
<Compile Include="Extensions\Loaders\AreaExtensionLoader.cs" />
|
||||||
<Compile Include="Extensions\StringExtensions.cs" />
|
<Compile Include="Extensions\StringExtensions.cs" />
|
||||||
<Compile Include="Extensions\UriExtensions.cs" />
|
<Compile Include="Extensions\UriExtensions.cs" />
|
||||||
<Compile Include="Mvc\AntiForgery\ValidateAntiForgeryTokenOrchardAttribute.cs" />
|
<Compile Include="Mvc\AntiForgery\ValidateAntiForgeryTokenOrchardAttribute.cs" />
|
||||||
|
<Compile Include="Mvc\FollowReturnUrl\FollowReturnUrlFilter.cs" />
|
||||||
<Compile Include="Mvc\Html\FileRegistrationContextExtensions.cs" />
|
<Compile Include="Mvc\Html\FileRegistrationContextExtensions.cs" />
|
||||||
<Compile Include="Mvc\Extensions\UrlHelperExtensions.cs" />
|
<Compile Include="Mvc\Extensions\UrlHelperExtensions.cs" />
|
||||||
|
<Compile Include="Mvc\FollowReturnUrl\FollowReturnUrlAttribute.cs" />
|
||||||
<Compile Include="Mvc\ViewModels\AdaptedViewModel.cs" />
|
<Compile Include="Mvc\ViewModels\AdaptedViewModel.cs" />
|
||||||
<Compile Include="Mvc\ViewUserControl.cs">
|
<Compile Include="Mvc\ViewUserControl.cs">
|
||||||
<SubType>ASPXCodeBehind</SubType>
|
<SubType>ASPXCodeBehind</SubType>
|
||||||
|
Reference in New Issue
Block a user