添加.submit(function(){}

时间:2015-04-26 05:32:43

标签: jquery ajax asp.net-mvc

最初的问题是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");
            }
            ...

1 个答案:

答案 0 :(得分:1)

您当前的代码是将模型ChannelViewModel.ID值和值为"parentForm"的字符串传递给editChannel()方法,然后将该字符串传递给控制器​​EditChannel()方法。参数updatedModelChannelAndLocationViewModel类型的复杂对象,不能绑定到字符串,因此绑定失败,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参数中)。