4

ホテルモデルをコントローラー アクションに渡すつもりです。いくつかのチェック/処理を行ってから、部分ビューでレンダリングされた別のホテルモデルを返す可能性があります。

私が得ている問題は、oHotelParameterモデルをアクションに渡すと、PartialView メソッドに渡されたモデルではなく、アクションに渡されたモデルを使用することです。

アクションからoHotelParameterパラメータを削除すると、ビューはoHotelを使用して期待どおりにレンダリングされます。

    public ActionResult _SaveMasterDetails(Hotel oHotelParameter)
    {
        //Do some processing on oHotelParameter

        //........
        Hotel oHotel = new Hotel();
        oHotel.GetHotelInfoById(14); //This gets a different Hotel object just for a test

        //For some reason oHotel is ignored and oHotelParameter is used instead unless I remove oHotelParameter 
        return PartialView("_MasterDetails", oHotel);
    }

ビューをデバッグすると、モデルが PartialView ( oHotel ) に渡した値に設定されていることがわかりますが、アクションから返された結果にはoHotelParameterオブジェクトからのデータが含まれています。

違いが生じる場合に備えて、jQuery ajax からアクションを呼び出しています。

なぜこれが起こるべきなのか誰でも説明できますか?

4

2 に答える 2

3

mvc がフォーム ポストを処理するとき、ModelState オブジェクトにモデルの詳細を入力します。

これは、ポスト アクションからビューが再度レンダリングされるときに使用されます。これは、検証に失敗したためにビューを元に戻した場合です。

ビューステートを使用せずに新しいモデルを渡したい場合は、ビューを返す前に ModelState.Clear() を呼び出すことができます。これにより、ビューを新しいモデルに再バインドできます。

于 2013-06-05T13:52:46.837 に答える
3

アクション メソッドにポストバックする際のモデル バインディングのしくみについて理解を深めていただけると助かると思います。ほとんどの場合、ビュー モデルをパラメーターとして POST アクション メソッドに渡すことは不必要で非効率的です。ビューモデルをパラメーターとして渡すときに、ビューモデルをメモリに2回ロードしています(強く型付けされたビューを想定しています)。ポストバックを行うと、モデルは、すべてのコントローラーが継承する BaseController クラスのリクエスト オブジェクトのフォーム コレクションの一部になります (モデル バインディングを介して)。BaseController の Request オブジェクトの Form コレクションからモデルを抽出するだけです。これを行うのに役立つ TryUpdateModel という便利なメソッドがあります。これがあなたのやり方です

[POST]
public ActionResult Save()
{
    var saveVm = new SaveViewModel();

    // TryUpdateModel automatically populates your ViewModel!
    // TryUpdateModel also calls ModelState.IsValid and returns
    // true if your model is valid (validation attributes etc.)
    if (TryUpdateModel(saveVm)
    {
        // do some work
        int id = 1;
        var anotherSaveVm = GetSaveVmBySomeId(id);

        // do more work with saveVm and anotherSaveVm
        // clear the existing model
        ModelState.Clear();
        return View(anotherSaveVm);
    }
    // return origonal view model so that the user can correct their errors
    return View(saveVm);
}

リクエストオブジェクトに含まれるフォームコレクションのデータがビューで返されていると思います。モデルをポスト アクション メソッドにパラメーターとして渡す場合、クエリ文字列で渡されると思います (Request.QueryString を参照)。ほとんどの場合、1 つまたは 2 つのプリミティブ型パラメーターまたは int? アクションメソッドに。Request オブジェクトの Form コレクションに既に含まれているため、モデル全体を渡す必要はありません。QueryString を調べたい場合は、Request.QueryString を参照してください。

于 2013-06-05T14:43:04.123 に答える