From ec08d3e91098d76b7ac1a1c576ab182a4348f002 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 10 Feb 2014 18:34:12 +1100 Subject: [PATCH] Updates MembershipHelper to not change the email/name if the value has not changed. Updates the templates to show only validation summaries for their own values/prefixes. Fixes some underlying MVC methods that merge view state to ensure the prefixes work with validation summaries properly when not showing property level errors. Updates the Umb controllers to add model level validation msgs when failed. --- .../Templates/EditProfile.cshtml | 18 +++++------------- .../PartialViewMacros/Templates/Login.cshtml | 2 +- .../Templates/RegisterMember.cshtml | 4 ++-- .../Controllers/UmbLoginController.cs | 3 ++- .../Controllers/UmbProfileController.cs | 3 ++- .../Controllers/UmbRegisterController.cs | 6 ++---- src/Umbraco.Web/ModelStateExtensions.cs | 4 +++- .../Mvc/ViewDataContainerExtensions.cs | 2 ++ src/Umbraco.Web/Security/MembershipHelper.cs | 11 +++++++---- 9 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/EditProfile.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/EditProfile.cshtml index 9d717f7d42..d1e8f2bf48 100644 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/EditProfile.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/EditProfile.cshtml @@ -14,24 +14,16 @@ Html.RequiresJs("/umbraco_client/ui/jquery.js"); Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js"); Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js"); + + var success = TempData["ProfileUpdateSuccess"] != null; + } @*NOTE: This RenderJsHere code should be put on your main template page where the rest of your script tags are placed*@ @Html.RenderJsHere() @if (Members.IsLoggedIn()) -{ - Html.EnableClientValidation(); - Html.EnableUnobtrusiveJavaScript(); - Html.RequiresJs("/umbraco_client/ui/jquery.js"); - Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js"); - Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js"); - - var success = TempData["ProfileUpdateSuccess"] != null; - - @*NOTE: This RenderJsHere code should be put on your main template page where the rest of your script tags are placed*@ - @Html.RenderJsHere() - +{ if (success) { // This message will show if RedirectOnSucces is set to false (default) @@ -43,7 +35,7 @@
Edit profile - @Html.ValidationSummary(true) + @Html.ValidationSummary("profileModel", true) @Html.LabelFor(m => profileModel.Name) @Html.TextBoxFor(m => profileModel.Name) diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Login.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Login.cshtml index 52184e8c73..d37833bc2f 100644 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Login.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Login.cshtml @@ -24,7 +24,7 @@
Login - @Html.ValidationSummary(true) + @Html.ValidationSummary("loginModel", true) @Html.LabelFor(m => loginModel.Username) @Html.TextBoxFor(m => loginModel.Username) diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/RegisterMember.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/RegisterMember.cshtml index ed1e0915d4..5e99b7b6a2 100644 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/RegisterMember.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/RegisterMember.cshtml @@ -58,8 +58,8 @@ else {
Register Member - - @Html.ValidationSummary(true) + + @Html.ValidationSummary("registerModel", true) @Html.LabelFor(m => registerModel.Name) @Html.TextBoxFor(m => registerModel.Name) diff --git a/src/Umbraco.Web/Controllers/UmbLoginController.cs b/src/Umbraco.Web/Controllers/UmbLoginController.cs index c1b8c3d14e..3ae41835bc 100644 --- a/src/Umbraco.Web/Controllers/UmbLoginController.cs +++ b/src/Umbraco.Web/Controllers/UmbLoginController.cs @@ -19,7 +19,8 @@ namespace Umbraco.Web.Controllers if (Members.Login(model.Username, model.Password) == false) { - ModelState.AddModelError("loginModel.Username", "Invalid username or password"); + //don't add a field level error, just model level + ModelState.AddModelError("loginModel", "Invalid username or password"); return CurrentUmbracoPage(); } diff --git a/src/Umbraco.Web/Controllers/UmbProfileController.cs b/src/Umbraco.Web/Controllers/UmbProfileController.cs index af647215ac..03c5ee91ff 100644 --- a/src/Umbraco.Web/Controllers/UmbProfileController.cs +++ b/src/Umbraco.Web/Controllers/UmbProfileController.cs @@ -29,7 +29,8 @@ namespace Umbraco.Web.Controllers var updateAttempt = Members.UpdateMemberProfile(model); if (updateAttempt.Success == false) { - ModelState.AddModelError("profileModel.Email", updateAttempt.Exception); + //don't add a field level error, just model level + ModelState.AddModelError("profileModel", updateAttempt.Exception.Message); return CurrentUmbracoPage(); } diff --git a/src/Umbraco.Web/Controllers/UmbRegisterController.cs b/src/Umbraco.Web/Controllers/UmbRegisterController.cs index 3dad27a13d..c661c24f69 100644 --- a/src/Umbraco.Web/Controllers/UmbRegisterController.cs +++ b/src/Umbraco.Web/Controllers/UmbRegisterController.cs @@ -64,10 +64,8 @@ namespace Umbraco.Web.Controllers case MembershipCreateStatus.InvalidProviderUserKey: case MembershipCreateStatus.DuplicateProviderUserKey: case MembershipCreateStatus.ProviderError: - ModelState.AddModelError((model.UsernameIsEmail || model.Username == null) - ? "registerModel.Email" - : "registerModel.Username", - "An error occurred creating the member: " + status); + //don't add a field level error, just model level + ModelState.AddModelError("registerModel", "An error occurred creating the member: " + status); break; default: throw new ArgumentOutOfRangeException(); diff --git a/src/Umbraco.Web/ModelStateExtensions.cs b/src/Umbraco.Web/ModelStateExtensions.cs index d2980c5aab..56fa2cf1af 100644 --- a/src/Umbraco.Web/ModelStateExtensions.cs +++ b/src/Umbraco.Web/ModelStateExtensions.cs @@ -16,7 +16,9 @@ namespace Umbraco.Web { if (dictionary == null) return; - foreach (var keyValuePair in dictionary.Where(keyValuePair => keyValuePair.Key.StartsWith(prefix + "."))) + foreach (var keyValuePair in dictionary + //It can either equal the prefix exactly (model level errors) or start with the prefix. (property level errors) + .Where(keyValuePair => keyValuePair.Key == prefix || keyValuePair.Key.StartsWith(prefix + "."))) { state[keyValuePair.Key] = keyValuePair.Value; } diff --git a/src/Umbraco.Web/Mvc/ViewDataContainerExtensions.cs b/src/Umbraco.Web/Mvc/ViewDataContainerExtensions.cs index ef611e96c4..f8f627d39a 100644 --- a/src/Umbraco.Web/Mvc/ViewDataContainerExtensions.cs +++ b/src/Umbraco.Web/Mvc/ViewDataContainerExtensions.cs @@ -23,6 +23,8 @@ namespace Umbraco.Web.Mvc { var newContainer = new ViewDataContainer(); newContainer.ViewData.ModelState.Merge(container.ViewData.ModelState, prefix); + //change the html field name too + newContainer.ViewData.TemplateInfo.HtmlFieldPrefix = prefix; return newContainer; } diff --git a/src/Umbraco.Web/Security/MembershipHelper.cs b/src/Umbraco.Web/Security/MembershipHelper.cs index 107f1fd563..11523cf561 100644 --- a/src/Umbraco.Web/Security/MembershipHelper.cs +++ b/src/Umbraco.Web/Security/MembershipHelper.cs @@ -69,8 +69,12 @@ namespace Umbraco.Web.Security try { - //Use the membership provider to change the email since that is configured to do the checks to check for unique emails if that is configured. - membershipUser = UpdateMember(membershipUser, Membership.Provider, model.Email); + //check if the email needs to change + if (model.Email.InvariantEquals(membershipUser.Email) == false) + { + //Use the membership provider to change the email since that is configured to do the checks to check for unique emails if that is configured. + membershipUser = UpdateMember(membershipUser, Membership.Provider, model.Email); + } } catch (Exception ex) { @@ -82,11 +86,10 @@ namespace Umbraco.Web.Security //NOTE: If changing the username is a requirement, than that needs to be done via the IMember directly since MembershipProvider's natively do // not support changing a username! - if (model.Name != null) + if (model.Name != null && member.Name != model.Name) { member.Name = model.Name; } - member.Email = model.Email; if (model.MemberProperties != null) {