0

動的に作成されたフォームで mvc3 を使用していますが、デフォルトの modelBinder が役に立ちません。

コントロール値に関連付けられ、フォーム コレクションに戻されるフォーム コレクション キーを制御したいと考えています。

controllerContext.HttpContext.Request.Form["IWantToSetThisKeyRightHere"]

現在、これらのキーは、デフォルトのモデルバインディングをサポートするために理解していない場所で自動生成されていますが、とにかくうまくいきません。

ビューを作成するときにこれらの値を設定して、動的フォームが投稿されたときにデータを抽出するために独自のカスタム モデル バインダーを試すことができるようにするにはどうすればよいですか?

ありがとう

4

2 に答える 2

0

前の質問に基づくと、問題はそれほど複雑ではないようです。あなたはそれを必要以上に難しくしています。必要なのは、次のような単純なモデルだけです。

public class Container {
    public List<Container> Containers {get;set;}
    public Question Question {get;set;}
}

public class Question {
    public List<Answer> Answers {get;set;}
}

ここで推測すると、回答にはおそらく何も含めることができないため、独自のオブジェクトが必要であり、質問には回答のみを含めることができます。質問に他の質問やコンテナを含めることができる場合は、これを少し変更して機能させることができます。

これには特別なモデル バインダーは必要ありません。

単一のベースからすべてのオブジェクトを継承する必要はありません。また、奇妙なテンプレート セレクターを使用する必要もありません。

これを行うには、次のようにします。

EditorTemplates/Container.cshtml

@model Container

@Html.EditorFor(m => m.Containers)
@Html.EditorFor(m => m.Question)

EditorTemplates/Question.cshtml

@model Question

@Html.EditorFor(m => m.Answers)

EditorTemplates/Answer.cshtml

@model Answer

// whatever your answer code is.. if you have multiple answer types then you 
// need a template for each type

デフォルトの MVC テンプレート システムは、これらすべてを処理し、すべてをモデル バインドします。モデルをビューに渡す前に、モデルを正しくインスタンス化する必要があります。

于 2012-06-07T04:39:17.190 に答える
0

フォーム コレクションのキーは、input 要素の name プロパティから取得されます。HTMLヘルパーを使用してname属性に新しい値を渡すことで、それをオーバーライドしようとしていました。

このような:

@{ var uniqueNameAttribute = new { name = Model.UniqueName };}   
@Html.TextBox(Model.MessageText, Model.Answer, uniqueNameAttribute)

設定しようとしていた名前の値 (Model.UniqueName) は、投稿後の modelBinding 中に値を同じモデル クラスにマップできるように、mvc によっておそらく設計された文字列によって上書きされていました。

私のシステムは動的であるため、mvc はデータをモデルにマッピングできません。その値を制御して、投稿時にデータを手動でマッピングできるようにしたかったのです。

解決策は非常に単純で、@Html.TextBox ヘルパーを使用してテキスト ボックスを生成するのではなく、目的の name プロパティを使用して自分で作成するだけで済みました。

<input type="text" class="vmFreeTextAnswer" name="@Model.UniqueName" value="" />

これにより、投稿された値を投稿時に動的に構造化されたモデルにフックすることができます。

于 2012-06-07T21:06:12.300 に答える