1

tab2がアクティブなときにサーバーにポストバックするとviewModel.FirstName、アクションメソッドでnullになります。@Html.EditorFor(m => m.FirstName)タブがアクティブなときにタブ2から取得する必要があることをモデルバインダーにどのように伝えますか? tab1 ではすべて正常に動作します。

タブの切り替えには jQuery hide() と show() を使用します。

コントローラ

    [HttpPost]
    public ActionResult Index(MyViewModel viewModel)

意見

<div id="tab1">
   @Html.EditorFor(m => m.FirstName)
</div>
<div id="tab2">
   @Html.EditorFor(m => m.FirstName)
</div>
4

2 に答える 2

0

同じフォーム内に両方の FirstName 入力フィールドがあるようです。

何かのようなもの:

<form>
  <div id="tab1">
     @Html.EditorFor(m => m.FirstName)
  </div>
  <div id="tab2">
     @Html.EditorFor(m => m.FirstName)
  </div>
</form>

これを投稿すると、フォームは次のように送信されます。

FirstName=valueFromField01&FirstName=valueFromField02

あなたが説明している動作から、モデル バインダーが FirstName フィールドを に設定するMyViewModelと、2 番目のフィールドは無視されるようです (しかし、それについてはよくわかりません)。

ソリューション:

  1. 内部に異なるタブを含むフォームを作成するのではなく、各タブ内にフォームを作成します。これにより、フォーム内に FirstName が 1 つしかないことが保証されます。
  2. 両方のフィールドを取得するようにモデルを更新します。string: の配列を使用する必要がありますstring[] FirstName

更新: ViewModel を更新する代わりに、アクション メソッドに別のパラメーターを追加するだけで、両方の FirstName 値を取得し、どちらが実際に提供されたかを把握できるようにする方が簡単な場合があります。

public ActionResult Index(MyViewModel viewModel, string [] FirstName). 

次に、viewModel で FirstName を設定するロジックをアクション メソッドに含めることができます。

if(!string.IsNullOrEmpty(FirstName[0]))
{
   viewModel.FirstName = FirstName[0]
}
else if(!string.IsNullOrEmpty(FirstName[1]))
{
   viewModel.FirstName = FirstName[1];
}
于 2013-08-12T21:43:13.850 に答える