2

私は ASP.NET Web フォームから抜け出したばかりで、現在は MVC の初心者です。ASP.NET Web フォームとは異なり、MVC は ViewState を管理しないことを読みました。どうすればデータの永続性を実現できるのだろうと思っていました。

強く型付けされたモデルを使用したこの単純なフォームがあります。

class MyModel
{
    public string TextboxData { get; set; }
    public string HiddenData { get; set; }
}

次の形式を使用します。

@using (Html.BeginForm())
{
     @Html.TextBoxFor(m => m.TextboxData)
     @Html.HiddenFor(m => m.HiddenData)
}

私のコントローラーはシンプルなものです。モデル内のデータを処理してビューに戻すだけです。

[HttpPost]
public ActionResult PerformAction(MyModel mv)
{
    mv.DoSomething();
    return View(mv);        
}

コントローラーはモデルを再利用するだけなので、前回の送信で入力されたすべてのデータが次の更新時に保持されると想定してもよろしいですか?

実際には、TextboxData 用のものは保持されていましたが (ポストバック後、テキスト ボックスにはまだ入力されたデータが含まれています)、HiddenData 用のものは保持されていませんでした。ここで何か間違ったことをしていますか?

4

3 に答える 3

2

内部でまたはプロパティmv.DoSomething();の値を変更しても、ビューをレンダリングするときにそれらの変更は反映されません。その理由は、やなどの HTML ヘルパーが、バインド時に最初に ModelState 内を検索し、次にモデル内を検索するためです。これは仕様によるものです。TextboxDataHiddenDataTextBoxForHiddenFor

したがって、POST アクション内で最初に投稿された値を変更する必要がある場合は、最初に ModelState からそれらを削除する必要があります。

[HttpPost]
public ActionResult PerformAction(MyModel mv)
{
    // we intend to modify the values => we must remove them from ModelState
    // or the HTML helpers will reuse the old values
    ModelState.Remove("TextboxData");
    ModelState.Remove("HiddenData");

    mv.TextboxData = "some new value";
    mv.HiddenData = "some new hidden value";

    return View(mv);        
}
于 2012-07-02T13:14:49.567 に答える
2

あなたは正しいことをしているようです。サーバーに投稿されたときに、非表示のテキストデータも送信する必要があります。

非表示フィールドの ID が重複しているか、無効のようです。ご参照ください

Razor MVC モデルが保存アクションでデータを失っている

ASP.Net MVC 隠しフィールドが期待どおりに機能しない

これらの投稿が問題を解決することを願っています。

于 2012-07-02T11:56:03.583 に答える
1

POST では、モデルは自動的に入力されます。

この dotnetslackers の記事で、モデル バインドがどのように機能するかについての説明を参照してください。

今あなたの問題に - 質問に投稿されたコードを見ると、あなたはそれを正しくやっているように見えます. ここで問題を解決するには、次のことを行う必要があります。 1. ページのソースを表示します。2.隠しフィールドが値でレンダリングされているかどうかを確認します(期待する値は何でも)

レンダリングされた非表示フィールドが期待どおりの値に設定されていない場合は、モデルの作成時に "m.HiddenData" に適切な値が設定されていない可能性があります。

お役に立てれば!!

于 2012-07-02T12:54:35.333 に答える