【发布时间】:2015-12-20 02:00:10
【问题描述】:
我有一个包含三个表单字段(2 个文本框、1 个下拉菜单)、一个提交按钮和一个“刷新”链接的页面。我希望能够单击链接并将两个表单文本框值传递给控制器操作,并获取值列表以填充下拉框。我不想在这个阶段提交表单。
目前,我已经设法从链接单击调用控制器操作,但由于某种原因我无法传递两个表单字段值。此外,返回的 JSON 只是将我带到一个新页面,而不是填充我的下拉列表。任何指针都会很棒,因为我是 javascript 和 MVC 的新手。我的代码如下;
控制器
public ActionResult Find(AddressFormViewModel model)
{
...
var temp = new List<OptionModel>();
temp.Add(new OptionModel {Id = item.Id, Value = item.desc});
return Json(temp, JsonRequestBehavior.AllowGet);
}
HTML
@Html.TextBoxFor(x => Model.HouseNameInput, new { id = "HouseNameInput" })
@Html.TextBoxFor(x => Model.PostCodeInput, new { id = "PostCodeInput" })
@Html.ActionLink("Find","Find", "Address", new { houseInput = Model.HouseNameInput, postcodeInput = Model.PostCodeInput }, new { htmlAttributes = new { @class = "Find" } })
@Html.DropDownListFor(x => Model.AddressOption, Enumerable.Empty<System.Web.Mvc.SelectListItem>(), "-- Loading Values --", new {id = "AddressOptions"})
最后,我的 Javascript 方法从控制器操作中检索数据但不填充下拉列表(它在新页面中显示结果)。它也没有成功地将表单值发送到控制器操作。
$(function () {
$('.Find').click(function (evt) {
$.ajax({
type: 'POST',
url: '@Url.Action("Find","AddressFormSurface")',
cache: false,
async: true,
dataType: "json",
contentType: "application/json; charset=utf-8",
data: {
houseNameInput: $("#HouseNameInput").value,
postCodeInput: $("#PostCodeInput").value
},
success: function (data) {
if (data.exists) {
var ddl = $('#AddressOptions');
ddl.empty();
data.each(function () {
$(document.createElement('option'))
.attr('value', this.Id)
.text(this.Value)
.appendTo(ddl);
});
}
},
error: function (req) {
}
});
// we make sure to cancel the default action of the link
// because we will be sending an AJAX call
return false;
});
});
【问题讨论】:
-
首先删除
contentType: "application/json; charset=utf-8",。并建议您只使用<a href="#" id="find">Find</a>而不是助手(添加死记硬背值等没有意义)并使用$('#find').click() { -
@StephenMuecke 对,但在你的情况下,你可以在
$.ajax之前写evt.preventDefault();,我猜它会起作用 -
@teovankot,OP 已经在脚本末尾添加了
return false;,但如果执行重定向,脚本显然不会运行。 -
@StephenMuecke 好吧,我的错 =)
标签: javascript jquery ajax asp.net-mvc