0

ドロップダウンリストのあるビューがあります。このデフォルト値はセッション変数に保存されます。ただし、ユーザーがこれを変更すると、新しいデータが入力されます。

ドロップダウンに変更ハンドラーがあります。

@using (Html.BeginForm())
{
  @Html.DropDownListFor(model => model.SelectedID, 
                        new SelectList(Model.SelectValues, "Key", "Value",
                        Model.SelectedID), "", new { onchange = "this.form.submit()" });

 ... more fields ...
 <input type="submit" name="Save" />
}

  [HttpPost]
  public ActionResult Index(ViewModel vm)
  {
     ... decide if I update my data or save the changes ...
  }

選択を別のフォーム タグでラップしようとしましたが、ビュー モデルで SelectedID の値が更新されませんでした。

ドロップダウンの変更からフォームが投稿されたとき、およびボタンのクリックからフォームが投稿されたときを確認するにはどうすればよいですか?

4

2 に答える 2

2

ユーザーがドロップダウンの選択を変更したときにページ全体をリロードしたくない場合は、AJAXを使用して、必要な更新を行う別のコントローラーアクションへのリクエストをサイレントにトリガーできます。例えば:

@Html.DropDownListFor(
    model => model.SelectedID, 
    new SelectList(Model.SelectValues, "Key", "Value"), 
    "", 
    new { 
        id = "myddl",
        data_url = Url.Action("update")
    }
)

次に、別のjavascriptファイルで:

$(function() {
    $('#myddl').change(function() {
        var form = $(this).closest('form');
        $.ajax({
            url: $(this).data('url'),
            type: 'POST',
            data: form.serialize(), 
            success: function() {
                alert('update success');
            }
        });
    });
});

そして最後に、更新を担当するコントローラーアクションを持つことができます。

[HttpPost]
public ActionResult Update(ViewModel vm)
{
    ... this will be triggered everytime the user changes some value in the
        droipdown list
}
于 2012-05-01T17:02:23.653 に答える
1

最も簡単な方法は、これらの要素のイベントにいくつかの動作をアタッチし、イベントターゲットで非表示フィールドを設定することです(これは、今では非常に馴染みがあるように聞こえ__EVENTTARGETます)。

そのようです:

$('#someButton').click(function()
{
    $('#someHiddenField').val('someButton');
});

$('#someDropDown').change(function()
{
   $('#someHiddenField').val('someDropDown');
});

そして、あなたの行動方法はこの値を調べて適切に行動することができます。

でも

MVCの時代遅れのコンセプトを考えているようですね。本当に新しい情報が必要な場合は、Ajaxを使用して、ページの一部を更新する場合は、アクションメソッドの1つが部分ビューを返すようにすることを検討する必要があります。

于 2012-05-01T17:03:07.427 に答える