2016-04-07 11 views
0

Umbracoでは、SurfaceControllerでMVCパーシャルをフックして、ポストバック後の再レンダリング時にモデル状態を失うか、モデルを早期に検証して@Html.ValidationMessageForヘルパーの検証エラーを表示します最初のページレンダリング。私が本当に欲しいのは、バニラMVCのパーシャルとモデルと一貫した動作です。Umbraco SurfaceControllerモデルの状態/モデル検証の問題

レンダリングとポストバックを処理するために、SurfaceControllerでサポートされているUmbracoで使用するMVCパーシャルを作成しています。

これらの部分を「マクロ」で囲み、必要な特別なページごとに特別なドキュメントタイプを作成するのではなく、他のコンテンツと一緒にページコンテンツにドロップすることができます。

部分:

@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がありますしかし、周りのこの作品は、将来的に必要とされないことがあります。