2016-04-07 78 views
0

在Umbraco中,我可以將MVC偏分量與SurfaceController掛鉤,在回發後重新呈現時丟失模型狀態,或者過早驗證模型,並在@Html.ValidationMessageFor助手上顯示驗證錯誤最初的頁面渲染。我真正想要的是符合vanilla MVC partials和models的行爲。Umbraco SurfaceController模型狀態/模型驗證問題

我創建MVC諧音爲一把umbraco使用由SurfaceController支持來處理渲染和後回。

我則在「宏」包裝這些諧音,使他們能投進頁面內容與其他內容,而不是創造所需的每個特殊頁特殊文件類型(會有很多)。

部分:

@using SomeProject.Web.Controllers 
@model SomeProject.Web.Models.Identity.UserModel 

@using (Html.BeginUmbracoForm<IdentitySurfaceController>("RegisterDetailsSubmit", null, new { @class = "form-horizontal" })) 
{ 
    @Html.AntiForgeryToken() 

    @Html.EditorFor(model => Model) 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <input type="submit" class="btn btn-primary" value="Register" /> 
     </div> 
    </div> 
} 

宏:

@inherits Umbraco.Web.Macros.PartialViewMacroPage 
@Html.Action("RegisterDetails", "IdentitySurface") 

SurfaceController:

using SomeProject.Web.Models.Identity; 
using System; 
using System.Web.Mvc; 

namespace SomeProject.Web.Controllers 
{ 
    public class IdentitySurfaceController : Umbraco.Web.Mvc.SurfaceController 
    { 

     [ChildActionOnly] 
     public ActionResult RegisterDetails(UserModel model) 
     { 
      if (model == null || model.Id == Guid.Empty) model = new UserModel(GetUser()); 

      return View(model); 
     } 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult RegisterDetailsSubmit(UserModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       ... 
      } 

      return CurrentUmbracoPage(); 
     } 

    } 
} 

當我使用:

[ChildActionOnly] 
public ActionResult RegisterDetails() 

我在回貼後呈現模型狀態時很鬆散。用戶編輯丟失。

當我使用:

[ChildActionOnly] 
public ActionResult RegisterDetails(UserModel model) 

驗證早,所以我看到驗證錯誤隨處可見,就好像一個回已經發生髮生。在代碼中設置斷點時,我可以看到SurfaceController代碼在命中局部視圖之前先被調用。在部分視圖中填充模型,但由於某些原因,所有驗證消息都會顯示爲模型爲空。如果我回發帖子,模型狀態將被保留,並且所有內容都按預期顯示 - 錯誤模型屬性的驗證消息,沒有好的模型屬性的消息。

我看到所有@Html.ValidationMessageFor項目的驗證消息,以及所有@Html.EditorFor項目中的有效模型屬性。

任何想法,我可能是做錯了?

回答

0

我通過調用ModelState.Clear(),當我們需要填充的模型,如果它不存在,解決了問題。

[ChildActionOnly] 
public ActionResult RegisterDetails(UserModel model) 
{ 
    if (model == null || model.Id == Guid.Empty) 
    { 
     model = new UserModel(GetUser()); 
     ModelState.Clear(); 
    } 

    return View(model); 
} 

但是,由於存在speculation that this scenario could be a bug in Umbraco 7.4.2,未來可能不需要此解決方法。