0

ASP.NETMVCアプリケーションがあります。ある時点で、モデルの更新に使用したいControllerメソッドのFormCollectionを取得します。コレクションでは、すべての値がそのモデルのプロパティであるとは限らず、更新されるプロパティはリストのアイテムであり、そのリストは別のリストのアイテムでもあります。このようなもの(これが明確であることを願っています):

propertyToUpdate --> model.Items[0].Subitems[0].SomePropertyClass.Value;

私は自分のコントローラーでこれを試しました:

UpdateModel(model);

問題は、これが機能していないことであり、反射が機能していないという事実と関係があると思います。私は検索に行き、この記事に出くわしました。したがって、prefix-parameterを使用すると問題が解決することを理解しています。しかし、私の場合はそうではありません。プロパティは、リストのアイテムとしてモデルの「より深い」位置にあるためです。

誰かが私がこれを解決する方法を知っていますか?

アップデート:

プロパティのEditorTemplateは次のとおりです。

@model Q95.Domain.Property

<li>
    @Html.DisplayFor(p => p.Description) : 
    @Html.DisplayFor(p => p.Quantity.Value)
    @Html.DisplayFor(p => p.Quantity.Unit.Description)
    <br />
    @Html.TextBoxFor(p => p.Quantity.Value)
</li>

このテンプレートは次のように呼ばれます。

<ul>
    @Html.EditorFor(model => model.SegmentRequirement.MaterialRequirements[j].Properties)
</ul>

これで十分なコードですか、それともまだ不足しているものがありますか?

Update2:

わかりました。すべてのサブプロパティで、パラメーターなしのコンストラクターを定義し、次のように呼び出します。

UpdateModel(segmentRequirement, "SegmentRequirement", form.ToValueProvider());

これによりモデルが更新されますが、MaterialRequirementsのすべてが再インスタンス化されます...:S

4

3 に答える 3

1

UpdateModel は「深いプロパティ」で正常に動作します。
問題はおそらく、取得したコレクション内のデータがプロパティ名と等しくないことです。
ページから取得した値を確認するには、3 つの場所をチェックしてください

  1. フォームの値。

  2. ルートデータ

  3. クエリ文字列

まさにその順序で。

キーはモデルプロパティの名前一致する必要があります。


更新:
キーをプロパティ名に一致させる方法は?
入力 ID が取得するキーになり、プロパティ名に一致するように ID を変更するか、HtmlTextBoxForヘルパーを使用することをお勧めします:この記事を参照してください:

于 2011-12-06T12:24:50.270 に答える
1

おそらく、フラット化された ViewModel を作成し、それを使用してビューにデータを入力し、後で実際のモデルと同期する必要があります。

于 2011-12-06T10:25:06.680 に答える
0

モデルとビューを見せていただけますか。htmlhelper を使用していない場合は、モデルでモデル バインディングを機能させるために、命名規則をよく理解する必要があります。まず最初に、モデルとビューを見せてください。

于 2011-12-06T11:11:50.970 に答える