0

2 つのエンティティ (外部キーでリンク) を持つモデルがあり、各エンティティには、部分ビューを使用してレンダリングされた独自のタブがあります。各タブには独自の Ajax フォームもあります。最初のタブでエンティティを保存すると、2 番目のエンティティの保存または最初のエンティティへの更新の保存を有効にするために、2 つの部分ビューに戻りたいエンティティの ID が表示されます。この値をビューに戻すことはできません。

モデル:

public class Entity1
{ 
    int ID1  { get; set; }
    [Some attributes]
    string field1 { get; set; }
}
public class Entity2
{ 
    int ID2  { get; set; }
    [Some attributes]
    string field2 { get; set; }
}
public class MyModel
{ 
    Entity1 entity1 = new Entity1()
    Entity2 entity2 = new Entity2()
}

コントローラー:

public class MyController : Controller
{
[HttpGet]
public ActionResult Index()
{
    var model = new MyModel();
    model.entity1.ID1 = 0;
    model.entity2.ID2 = 0;
    return PartialView(model);
}

[HttpPost]
public ActionResult Index(MyModel model)
{
    SaveMyModel(model)
    // have tried ModelState.Clear(); here
    return PartialView(model);
}
}

最後に、2 つの部分ビューの 1 つ

@model MyModel
@using (Ajax.BeginForm("Index", "Home",
        new AjaxOptions
        {
            HttpMethod = "POST"
        }
        ))
    {
    @Html.LabelFor(m => m.Entity1.field1)
    @Html.EditorFor(m => m.Entity1.field1)
    @Html.HiddenFor(m => m.Entity1.ID1)
    <div class="form-actions">
        <button type="submit">
        Next section</button>
    </div>
    }

私の保存機能は、ID1 の値に応じて挿入または更新します。

問題は、ID1 の値が常にゼロのままであり、非表示フィールドが返されたときに更新されないことです。かみそりの更新をシングルステップで実行しようとしましたが、正しい ID がビューに送信されています。

上記は簡略化したものですが、問題をカプセル化しています。

前もって感謝します。

アップデート

次の場合、これを機能させることができます。

  • モデルにエンティティが 1 つしかない
  • ModelState.Clear();保存前に追加します
4

2 に答える 2

0

POST コントローラー アクションで値を変更する場合は、ModelState から値を削除する必要があります。

ModelState.Remove("Entity1.ID1");

この方法では、ModelState.Clear を使用して ModelState 全体をクリアする必要はありませんが、実際に変更する値のみをクリアする必要があります。このようにして、Html ヘルパーは ModelState の値ではなく、モデルから値を選択します。

于 2012-10-18T16:17:19.693 に答える
0

私は自分のプロジェクトで同じ問題に遭遇していました。私がそれを解決する唯一の方法は、ID が 0 のときに ID を含めないことでした。そうすれば、戻ってきたときに ID が置き換えられました。したがって、あなたの例では、次のようにします。

@model MyModel
@using (Ajax.BeginForm("Index", "Home",
        new AjaxOptions
        {
            HttpMethod = "POST"
        }
        ))
    {
    @Html.LabelFor(m => m.Entity1.field1)
    @Html.EditorFor(m => m.Entity1.field1)
    @if(Model.Entity1.ID1 !=0){
         Html.HiddenFor(m => m.Entity1.ID1)
    }
    <div class="form-actions">
        <button type="submit">
        Next section</button>
    </div>
    }
于 2013-09-25T14:58:39.237 に答える