umbraco mvc 表面控制器,無法從 HttpPost 操作返回視圖
問題概述:
我創建了一個 Surface 控制器,其中包含使用 @Html.Action(…) 呼叫的操作。
@Html.Action 呼叫在宏局部視圖中完成,宏包含在使用富文本編輯器的頁面內容中。
(我是新手,所以如果我以錯誤的方式處理事情,請告訴我。)
Surface 控制器有一個 GET 和一個 POST 操作,但它是在宏部分中呼叫的 get 操作。
獲取操作呈現正常,在表單中不輸入任何數據將使模型狀態無效(這是我目前正在測試的)。
送出表單(沒有輸入數據)意味著我可以進入我的 POST 操作,ModelState.IsValid 設置為 false 並返回 CurrentUmbracoPage()。
一切都好…調試時沒有遇到異常…
此時頁面上出現錯誤文本“載入部分視圖腳本時出錯”。
我要做的就是返回顯示驗證消息的同一頁面。
細節:
Umbraco v6.0.5
我目前正在使用的控制器用於重置使用者的密碼。我還有一個登錄控制器,它通過使用 RedirectToCurrentUmbracoPage() 來解決這個問題。
要訪問包含宏的頁面,我使用地址 http://{testhost}/Reset-Password 返回的錯誤文本為:載入部分視圖腳本時出錯(文件:~/Views/MacroPartials/ResetPassword.cshtml)
程式碼在一個單獨的解決方案中,視圖和 bin 目錄被複製。使用 nuget 包 UmbracoCMS.Scaffolding。
控制器程式碼:
public class ResetPasswordSurfaceController : SurfaceController { [ChildActionOnly] [HttpGet] public ActionResult Reset(string token, string email) { // Validation Code Omited var user = Membership.GetUser(username); return PartialView("Reset", new ResetPasswordSurfaceModel { UserID = user.ProviderUserKey.AsInt() }); } [HttpPost] public ActionResult PostReset(ResetPasswordSurfaceModel model) { if (ModelState.IsValid) { //Password reset code omited return RedirectToCurrentUmbracoPage(); } //works but only partial view content is rendered // return PartialView("Reset",model); return CurrentUmbracoPage(); } }查看 - ~\Views\ResetPasswordSurface\Reset.cshtml:
@model UmbracoExt.Models.ResetPasswordSurfaceModel @using (Html.BeginUmbracoForm("PostReset", "ResetPasswordSurface")) { @Html.EditorForModel() <input type="submit" value="Submit" /> }宏部分視圖 - ~\Views\MacroPartials\ResetPassword.cshtml:
@inherits Umbraco.Web.Macros.PartialViewMacroPage @Html.Action("Reset", "ResetPasswordSurface")任何幫助表示讚賞。
編輯:
刪除
$$ HttpGet $$來自 Reset Action 的屬性顯示,在呼叫 PostReset 動作之後,還會呼叫 Reset 動作。 將 PostReset 重命名為 Reset 並將 httpget 屬性重新添加到原始的 Reset Action 會導致 post 操作被呼叫兩次。第二次呼叫導致異常:Can only use UmbracoPageResult in the context of an Http POST when using a SurfaceController form
我已經恢復了更改,所以我回到了重置(
$$ HttpGet $$) 在 PostReset 操作之後被呼叫。 所以問題仍然存在。我該如何解決這個問題?我需要從 PostReset Action 返回結果。
答案是在這裡給我的
所有功勞歸功於香農·德米尼克
post 操作不會為響應返回任何內容(這對我來說是新的)。在第二次執行Reset action的post後,由於modelstate被維護,通過傳遞一個新實例化的model,這個model會繼承POST action中處理的model的model state(PostReset)。
在第二次呼叫 Reset 操作期間,驗證邏輯意味著它永遠不會到達返回部分視圖的地步。
我暫時繞過了驗證邏輯,果然顯示了模型驗證消息。
這就是我解決這個問題的方法:
- 我為模型創建了擴展方法:
public static class ExtensionMethods { public static void MapModel<T>(this WebViewPage<T> page) where T : class { var models = page.ViewContext.TempData.Where(item => item.Value is T); if (models.Any()) { page.ViewData.Model = (T)models.First().Value; page.ViewContext.TempData.Remove(models.First().Key); } } }
- 控制器程式碼:
[HttpPost] public ActionResult Index(MyModel model) { TempData.Add("MyModel", model); return RedirectToCurrentUmbracoPage(); }
- 部分視圖程式碼:
@using UmbracoTest.Extension @using UmbracoTest.Models @model MyModel @{ this.MapModel<MyModel>(); } @using (Html.BeginUmbracoForm("Index", "Home", FormMethod.Post)) { <div> @Html.TextBox("Text", Model.Text ) </div> <input type="submit" name="submit" value="Submit" /> }