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,然后如果您想更新页面的一部分,则让您的操作方法之一返回部分视图。

于 2012-05-01T17:03:07.427 回答