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
アイテムの有効なモデルプロパティが表示されます。
私は間違っていると思いますか?