2

これは部分的に見たMVC3フォームのフォローアップです

著者は問題の回避策を示しましたが。なぜこれが機能しないのか、正しい答えを見つけたいと思います。

私は元のコードにアクセスできませんが、ここに私のものがあります(次の質問に答えることができます):

// main view (which is partial too)
    @foreach (AddingComponentVM sc in Model)
    {
        @Html.Partial("_SearchIngredientUpdate", sc);     
    }

//partial view
@using (Ajax.BeginForm("IngredientSearchUpdate", new { controller = "Recipe" }, ajxOpt, new { id = "addingWidgetForm" + Model.IngredientID }))
    {           
        @Html.TextBoxFor(model => model.IngredientID)
        @Model.IngredientID
    }

@Model.IngredientIDには適切な値が含まれています。ただし、テキストボックスにはコントローラーに送信されたモデルの値が含まれており(原文のまま)、各フォームで明らかに同じです。

[AjaxOnly]
public JsonResult IngredientSearchUpdate(
    AddingComponentVM dataIn,
    [ModelBinder(typeof(SearchOptionsBinder))] SearchOptions sessionSO)

署名にAddingComponentVMがないアクションが上記の同じコードを呼び出す場合、フォームは正しくレンダリングされます。

public PartialViewResult IngredientSearch([ModelBinder(typeof(SearchOptionsBinder))] SearchOptions sessionSO)

誰かが私にこの奇妙な(少なくとも私にとっては)行動の原因を指摘することができますか?ありがとう!

4

1 に答える 1

2

このせいで眠れなかったのですが、答えはこうです。

PartialView と EditorTemplates のどちらを使用するかは問題ではありません。ここで説明したように:ビューに送信する前に、コントローラーアクション内で投稿されたフォームデータを変更する方法は?

「HTML ヘルパーは、キーの検索を試みるときに、次の優先順位を使用します。

  1. ViewData.ModelState ディクショナリ エントリ
  2. Model プロパティ (厳密に型指定されたビューの場合。このプロパティは View.ViewData.Model へのショートカットです)
  3. ViewData ディクショナリ エントリ」

したがって、値が投稿された場​​合は、StateModel コレクションをクリアするだけで十分です。その後、モデルからのデータは、使用される html ヘルパーによって取得されます。これはトリックを行います:

ModelState.Clear()
于 2012-08-04T23:18:04.667 に答える