2016-10-18 1 views
0

私はウンブラを使ってからしばらくしています。現在、多くのフォームを持つUmbraco 7のインスタンスを設定しています。 ModelStateを正しく処理するのに苦労しています。うまくいけば誰かが私が間違っていることを説明することができます。私はこれらの最後のカップルの多くの記事を読んだが、これを行うには多くの方法があるように見えますが、私が試したことは何も私のために働くものはありません。私は今どこにいるのかを説明します。提出されたがエラーがあるUmbraco 7 MVCフォームを返すにはどうすればよいですか?

public override ActionResult Index(RenderModel model) 
    { 
     var customModel = model.Content.As<MyCustomPage>(); 

     // Init the model that I want to bind to the form 
     ViewBag.EditFormModel = new EditFormModel() 
     { 
      MyProperty = "init value" 
     }; 

     return this.CurrentTemplate(customModel); 
    } 

マイフォームモデル::私の見解では

public class EditFormModel 
{ 
    public int Id { get; set; } 

    [System.ComponentModel.DisplayName("Label")] 
    [System.ComponentModel.DataAnnotations.Required] 
    public string MyProperty{ get; set; } 
} 

:強く型付けされたページモデル返すため同上を使用しています

マイページコントローラ

@{ 
    // Get the model returned after postback if available, otherwise the initialised model 
    var editFormModel = TempData["EditFormModel"] as LocationEditFormModel ?? ViewBag.EditFormModel as LocationEditFormModel; 
} 

@Html.Partial("CustomEditForm", editFormModel) 

それを部分図:

@model EditFormModel 
    @using (Html.BeginUmbracoForm("PostForm", "PostFormSurface", FormMethod.Post)) 
    { 
     @Html.ValidationSummary(false, string.Empty) 
     @Html.AntiForgeryToken() 
     @Html.EditorFor(m => m.MyProperty) 
     <input type="submit" class="btn btn-primary" value="Submit" /> 
    } 

マイ表面コントローラ:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult PostForm(LocationSearchFormModel model) 
    { 
     bool passesServerSideValidation = this.Validate(model); 

     if (passesServerSideValidation) 
     { 
      // Save and perform a redirect 
     } 
     else 
     { 
      // I read something that suggested I should clear model state here but it doesn't seem to make a difference 
      ModelState.Clear(); 

      ModelState.AddModelError(string.Empty, "Not valid"); 
     } 

     // Add the model to temp data so we can retain values on postback 
     TempData["SearchFormModel"] = model; 

     return CurrentUmbracoPage(); 
    } 

問題は、私は、フォームを送信すると、時点で私は私が期待するようModelState.IsValidが偽であることを観察することができますラインreturn CurrentUmbracoPage();を打つことです。しかし、私が踏むと、次のラインヒットはページのコントローラーのIndexメソッドです。直ちにModelState.IsValidが真となりました。したがって、フォームの再ロード時に私の検証サマリは表示されません。

明らかに私はここで何か間違っていますが、私がまだ読んでいないものは正しい方向に私を指摘しています。あなたのアドバイスに感謝します。

答えて

0

私たちは基本的にやっていることは(CurrentUmbracoPageを返すことです)フォームが有効でないとだけRedirectToCurrentUmbracoPageを(実行)それが有効だと、例えば、フォームを再投稿するための値を維持するために必須ではありません。モデルが有効かどうかを確認するにはModelStateを使用しています。あなたのコードは、そのような何かに単純化することができる

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult PostForm(LocationSearchFormModel model) 
{ 
    if (ModelState.IsValid == false || !this.Validate(model)) 
     return CurrentUmbracoPage(); 

    TempData["SearchFormModel"] = model; 

    return RedirectToCurrentUmbracoPage(); 
} 

それはテストされていない、BYTはおそらく、あなたはこの問題に対処するのに役立ちます。

+0

CurrentUmbracoPage()を返すとMVCの検証サマリーなどを使用できないため、ModelStateを自分のビューに永続させることができないという問題があります。この問題の解決方法を見つけました。私は時間があるときにここに投稿してください。 – getsetcode

+0

クール!それから見てみましょう:) –

0

解決策が見つかりました。

私の設定では、RenderMvcControllerサブタイプを通してレンダリングされるフォームがあります。 RenderModelからモデルを継承します。

私はSurfaceControllerサブタイプに投稿しています。このモデルは、投稿時に利用できないIPublishedContentを必要とするため、RenderModelを継承することはできません。

検証エラーが発生した場合の問題は、ModelContateを保持するコントローラコンテキストを離れることなく、SurfaceControllerのモデルに基づいてRenderMvcControllerの処理を行う必要があることです。

SurfaceControllerには、ViewをレンダリングするためにRenderModelのインスタンスを構築するために必要なIPublishedContentというプロパティCurrentPageがあります。コントローラのコンテキストを離れることなくViewをレンダリングすると、ModelStateをビューで使用できるようになります。

Umbraco(またはMVC)は、ポストされた値をコード内でコピーする必要なく再利用できるほどスマートです。

完全なコード例を作成するのは、現時点では大変です。ですから、SurfaceControllerでアクションを分かち合いましょう。 (というか、それの匿名化バージョン。)

[HttpPost] 
public ActionResult Index(MySurfaceControllerModel model) 
{ 
    if (!ModelState.Isvalid) 
    { 
     return View("MyView", new MyRenderModel(CurrentPage)); 
    } 

    // Do some stuff with my valid model. 

    return RedirectToAction("thenextpage"); 
} 

私はこれがある限り、私が持っているとしてそれを行うための方法を探してから他人を守ることを願っています。

関連する問題