我有一个页面有三个表单域(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”,但是
不对数据进行字符串化(应删除该选项)
>您需要使用.val()(而不是.value)来获取值
输入
>您收到的数据不包含名为exists so的属性
你追加选项的if块永远不会被击中
此外,不必使用@ Html.ActionLink()生成链接(根据模型的初始值添加路径值).而是手动创建它
<a href="#" id="find">Find</a>
并将脚本更改为
var ddl = $('#AddressOptions'); // cache it
$('#find').click(function () { // change selector
$.ajax({
type: 'GET', // its a GET, not a POST
url: '@Url.Action("Find","AddressFormSurface")', // see side note below
cache: false,
async: true,
dataType: "json",
data: {
houseNameInput: $("#HouseNameInput").val(),
postCodeInput: $("#PostCodeInput").val()
},
success: function (data) {
if (!data) {
// oops
return;
}
ddl.empty();
$.each(data, function(index, item) {
$(document.createElement('option'))
.attr('value', item.Id)
.text(item.Value)
.appendTo(ddl);
// or ddl.append($('<option></option>').text(item.Value).val(item.Id));
});
},
error: function (req) {
....
}
}
});
附注:同时检查控制器的名称.您的Html.ActionLink()建议使用其AddressController,但您的脚本正在调用AddressFormSurfaceController
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。