最初的问题是JQuery Ajax在点击C#方法后不会调用succuess。通过查看类似的问题:jQuery Ajax not returning success我看到解决方案是添加:
$(parentForm).submit(function(event) {
event.preventDefault();`
但是,执行此操作后,Ajax代码似乎无法执行。我确实点击了JS函数,但它在执行Ajax代码之前停止了。
我的HTML代码如下所示:
@{
const string formId = "parentForm";
}
@using (Html.BeginForm("EditChannel", "Channel", FormMethod.Post, new { id = formId }))
{
Html.RenderPartial("EditChannelForm", Model);
<br /><br />
<input type="button" value="Save" onclick="editChannel('@Model.ChannelViewModel.ID', @formId)" />
}
我在JS代码中提交此表单(单击上面的按钮时),如下所示:
function editChannel(channelId, parentForm) {
$(parentForm).submit(function(event) {
event.preventDefault();
$.ajax({
url: "/Channel/EditChannel/",
type: "POST",
cache: false,
data: {
id: channelId,
updatedModel: parentForm
},
success: function(msg) {
alert("Msg: " + msg);
if (msg === "ChangeOfSensitiveData") {
showAlertOnChangeOfSensitiveData('sensitivDataMsgDiv');
} else {
alert("Else");
}
},
error: function(msg) {
alert("error");
}
});
});
}
我确实点击了JS函数,但是ajax从不执行,因此不调用C#方法。如果我只这样做:
function editChannel(channelId, parentForm) {
$(parentForm).submit()
...
然后AJAX代码执行并命中C#方法,但从未命中成功函数。
C#看起来像这样:
[HttpPost]
public ActionResult EditChannel(int id, ChannelAndLocationViewModel updatedModel)
{
updatedModel.LocationItemViewModels = GetLocationItems();
if (ModelState.IsValid)
{
ChannelModel channel = null;
using (var context = new MaaneGrisContext())
{
var oldUnit = context.Channels.Where(c => c.ID == id).Select(c => c.Unit).SingleOrDefault();
var newUnit = updatedModel.ChannelViewModel.Unit;
if (oldUnit != null && !oldUnit.Equals(newUnit))
{
return Content("ChangeOfSensitiveData");
}
...
答案 0 :(得分:1)
您当前的代码是将模型ChannelViewModel.ID
值和值为"parentForm"
的字符串传递给editChannel()
方法,然后将该字符串传递给控制器EditChannel()
方法。参数updatedModel
是ChannelAndLocationViewModel
类型的复杂对象,不能绑定到字符串,因此绑定失败,updatedModel
的值始终为null。
删除onclick
属性并将按钮更改为
<input type="button" id="save" value="Save" />
然后将脚本修改为
var url = '@Url.Action("EditChannel", "Channel")';
var channelID = '@Model.ChannelViewModel.ID
$('#save').click(function() {
// serialize the form and add the additional parameter
var data = $('form').serialize() + '&' + $.param({ id: channelID });
$.post(url, data, function(msg) {
alert("Msg: " + msg);
....
});
});
或者,在视图中添加@Html.HiddenFor(m => m.ChannelViewModel.ID)
,然后使用var data = $('form').serialize()
ChannelViewModel.ID
的值将包含在帖子中,控制器中不需要int id
参数方法(它将绑定在updatedModel
参数中)。