【发布时间】:2016-01-21 18:52:28
【问题描述】:
在 ASP.NET MVC 中,我有以下输入表单(简化):
<div id="ajaxtarget">
@using (Ajax.BeginForm("SubmitForm", "Home", new AjaxOptions { UpdateTargetId = "ajaxtarget" }))
{
@Html.DropDownListFor(x => x.PostalCode, Model.PostalCodeItemList, new { @name = "PostalCodeId" , @id="PostalCodeId" })
@Html.LabelFor(x => x.StreetCode)
@Html.DropDownListFor(x => x.StreetCode, Model.StreetItemList, new { @id="StreetCodeId" })
...
<input type="submit" value="@Global.Execute" id="btnSubmit" />
}
</div>
当用户从第一个下拉列表中选择某些内容时,应通过 AJAX 填充第二个下拉列表。我可以通过 javascript 发送“呼叫”我的控制器来更新我的视图:
$(document).ready(function () {
$('#PostalCodeId').on('change', function () {
$(this).parents('form').submit();
});
});
我的问题是我的表单有很多不同的控件来触发我需要在控制器中处理的一些操作,所以我正在寻找一种在提交表单时添加一些额外参数的方法。
现在我找到了一个解决方案,我在我的模型和表单中添加了一个额外的字段,我根据哪个控件触发脚本来填充 javascript。 @Html.HiddenFor(x => x.ChosenControllerAction, new { id = "ChosenAction" }) 在我的控制器中,我可以根据这个值返回一个视图或动作:
public ActionResult SubmitForm(MyModel model)
{
if (model.ChosenControllerAction == "PopulateStreetCodes")
{
...
}
我确信一定有一种不同/更好的方式来归档我想做的事情。以复杂的自我更新 ajax 形式返回正确的 ActionResults 的正确方法是什么?
【问题讨论】:
-
第二个下拉列表应该通过 AJAX 填充??您根本没有这样做 - 您的脚本只是提交表单。你真正想做的是什么?
-
没错,我正在通过 ajax 提交表单,并且基于第一个下拉列表中的选择,我的 ajaxtarget 将被刷新,并且我的模型中第二个列表的值也会被更新。实际上,形式比这更复杂。我说出了我真正想做的事情:“我正在寻找一种在提交表单时添加一些额外参数的方法。”
-
但是你在你的问题中说过 第二个下拉列表应该通过 AJAX 填充基于第一个的选择 - 即级联下拉列表。您无需提交表单来执行此操作。参考this answer和this DotNetFiddle的例子
-
这是一个简化的例子。我选择了更新包含我的表单的 DIV 的 AJAX 表单的路由,如果可能的话,我更喜欢这种方式...
-
没问题(如果您对性能不佳感到满意)
标签: jquery asp.net-mvc asp.net-mvc-4 razor asp.net-ajax