MVC3&剃刀:如何构建形式&允许类似回发功能的动作?

时间:2012-05-01 16:58:33

标签: asp.net-mvc-3

我有一个带有下拉列表的视图。其默认值存储在会话变量中。但是,用户更改会更改此项,在这种情况下会输入新数据。

我在下拉列表中有一个更改处理程序:

@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 ...
  }

我尝试将select包装在单独的表单标记中,但是我的ViewID的值在我的视图模型中没有更新。

如何确定从下拉更改中发布表单的时间,以及何时从单击按钮发布表单?

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

最简单的方法是简单地将一些行为附加到这些元素的事件上,并使用事件目标设置一个隐藏字段(到目前为止,__EVENTTARGET听起来应该非常熟悉)。

像这样:

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

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

然后你的行动方法可以检查这个值并采取适当的行动。

<强>无论其

听起来你正在考虑过时的MVC概念。如果您确实需要一些新信息,则应考虑使用某些Ajax,然后如果要更新页面的一部分,则使用其中一个操作方法返回部分视图。