3

私はMVC4とノックアウトを使用しています。ビューモデルに強く型付けされたフォームがページにあります。そのビューモデルでは、たとえば次のような検証が定義されています。

[Required(ErrorMessage = "Title is required")]
public string Title { get; set; }

必須フィールドに入力せずにフォームに標準の投稿を行うと、アクションはモデルが無効であることを確認してビューに戻り@Html.ValidationSummary、フォームにあるためメインの検証メッセージが表示されます。@Html.ValidationMessageForフィールドに関連付けたため、個々のフィールドも無効(メッセージ付き)としてマークされます

そこで、ノックアウトを追加し、フォームを投稿する代わりに、今呼んでいますko.utils.postJson($("form")[0], self);。これでほとんどすべてが機能します。必須フィールドが入力されていない状態でフォームを投稿すると、個々の検証メッセージが表示されないことを除いて、アクションはモデルが無効であることを検出してビューに戻ります。

投稿前に入力されたフィールドも失われます。私は、mvcビューモデルを読み取り、変数をそのような値に設定することで、これを修正しようとしました。

var model = @Html.Raw(Json.Encode(Model));

そして、私のノックアウトビューモデルでその値を設定します

self.Title = ko.observable(model.Title);

しかし、「1」と入力すると、失敗した投稿が返されると、フィールドに「「1」」と入力されます。

これはフォームがそれほど複雑ではないので、回避できるのであれば、新しい検証レイヤーを導入したくありません。検証用の投稿があってもかまいません。

ありがとう、ダン

4

2 に答える 2

5

What I question. I was exploring this topic for the last 2 weeks. (Look up my questions from last few days if you want to). I came to conclusion that data annotations and fluent validation doesn't work on client side that is using knockout unfortunately. Hence you have to introduce another layer of validation.

Good news is that its well tested and as standard as knockout is.

You have mainly three options:

I was expecting community to tend to suggest using jQuery one, but apparently mainstream validation for knockout is the first choice there. It behaves very similarly to data annotations, but is obviously done on knockout view model fields.

Hope this helps (don't shoot the messenger :) )

于 2013-03-11T22:01:15.553 に答える
0

現在、ハイブリッド Web API / MVC プロジェクトを行って、同様の状況を調査しています。詳細ページのみがコントローラーからデータを受け取る場所。残りはノックアウトで処理。私が見ることができるオプション(いくつかはテスト済み、いくつかは修飾された推測):

  1. ViewModel と Knockout Clientside ViewModel を介して検証ロジックを複製します (上記で提案した Knockout-Validation を使用することをお勧めします)。本能的にファンキーに感じる。
  2. jquery の控えめな検証を使用して、フォームを通常の mvc の厳密に型指定されたフォームとして設定します。

1,2: ノックアウト/jquery を使用して、イベント (フォームが有効と見なされた場合) を処理します。非同期投稿にエラーが含まれている場合は、エラーが返されて表示されます (ブートストラップなどの一部の css / less / sass フレームワークには、エラーを挿入するためのアラート ボックス クラスが用意されています)。

  1. MVC コントロール ツールキット clientblockを確認してください。私はこのオプションを自分でテストする予定です。
  2. KnockoutMvcを試してみてください。これもこれに役立つようです。
于 2013-07-17T17:37:43.047 に答える