我有一个带有下拉列表的视图。其默认值存储在会话变量中。但是,用户更改会更改此项,在这种情况下会输入新数据。
我在下拉列表中有一个更改处理程序:
@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的值在我的视图模型中没有更新。
如何确定从下拉更改中发布表单的时间,以及何时从单击按钮发布表单?
答案 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,然后如果要更新页面的一部分,则使用其中一个操作方法返回部分视图。