Asp.net-Mvc

umbraco mvc 表面控制器,無法從 HttpPost 操作返回視圖

  • January 2, 2019

問題概述:

我創建了一個 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 操作期間,驗證邏輯意味著它永遠不會到達返回部分視圖的地步。

我暫時繞過了驗證邏輯,果然顯示了模型驗證消息。

這就是我解決這個問題的方法:

  1. 我為模型創建了擴展方法:
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);
     }
  }
}
  1. 控制器程式碼:
[HttpPost]
public ActionResult Index(MyModel model)
{
   TempData.Add("MyModel", model);
   return RedirectToCurrentUmbracoPage();
} 
  1. 部分視圖程式碼:
@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" />
}

引用自:https://stackoverflow.com/questions/16827552