【问题标题】:Formcollection input values are empty in controller after ajax callajax 调用后,Formcollection 输入值在控制器中为空
【发布时间】:2014-03-26 13:19:41
【问题描述】:

我遇到了 IE 和 FF 的问题;我的应用程序正在使用 Google Chrome。

我正在将模型绑定到 ASP.NET MVC 中的视图 我在表单(和其他一些控件)中有一个表格行。我用 ajax 调用替换了单击按钮时表格行的内容。 ajax 调用后,如果我提交如下所示的表单,我无法从控制器方法获取表单集合输入。我在ajax调用之前提交表单没有问题。

更新表格行内容的js代码:

function reloadCriteriaTable(unitID, criteriaCode, icerikRowSpan, icerikOnay) {
$.ajax({
    type: "GET",
    url: 'ApproveParts/ReloadCriteria',
    data: { contentID: $('[name="contentID"]').val(), unitID: unitID, criteriaCode: criteriaCode, selectedValue: $("#validator_" + criteriaCode).val(), icerikRowSpan: icerikRowSpan, icerikOnay: icerikOnay },
    cache: false,
    type: "POST",
    success: function (data, textStatus, XMLHttpRequest) {
        $('#tr_' + criteriaCode).replaceWith(data);
        $('#continueBtn').on('click', function () {
            $('#form_3').submit();
            return false;
        });
    },
    error: function (xhr, status, error) {
        alert(xhr + ' ' + status + " : " + error);
    }

});
}

点击功能:

$(document).on("click", ".btnSubmitCriteria", function () {
    $('#form_3').submit();
    return false;
});

控制器方法:

[HttpPost]
public ActionResult CourseCriteriaApprovment(FormCollection collection)
{

}

【问题讨论】:

  • 如果它不能在 IE 和 FF 中运行,很可能是您的客户端代码有问题。你真的在你的js中定义了两次type吗?补充一点,我不会使用 FormCollection,而是使用 ViewModel 来进行模型绑定。
  • 感谢您的回答,在我的真实代码中,我只有 'post' 类型;我粘贴了错误的代码块。出于某种原因,我不想在这个特定示例中使用 Viewmodel。我只想知道为什么在对表格行进行更新后我的 formcollection 为空,因为如果我不进行更新,我会在提交后从控制器正确获取 Formcollection
  • 您是否尝试在表单帖子上添加断点以查看调试器要说什么?
  • 我不明白你所说的表单帖子上的断点是什么意思,我在我的控制器方法上设置了断点,它显示 formcollection 没有键
  • 好的,那么您什么时候真正调用reloadCriteriaTable 函数?你能告诉我们那个代码吗?

标签: c# javascript jquery ajax asp.net-mvc


【解决方案1】:

首先要了解您在 ajax 调用中同时提到“GET”和“POST”的原因。仅使用“POST”。

试试这个

$.ajax({
    type: 'POST',
    url: '/ApproveParts/ReloadCriteria',
    dataType: 'json',
    contentType: 'application/json',
    data : return JSON.stringify({
            contentID: $('[name="contentID"]').val(),
            unitID: unitID,
            criteriaCode: criteriaCode,
            selectedValue: $("#validator_" + criteriaCode).val(),
            icerikRowSpan: icerikRowSpan,
            icerikOnay: icerikOnay
        });
});

在你的控制器动作中接受一个类而不是 FormCollection。该类的所有属性定义与您在 ajax 调用中发送的属性相同。

【讨论】:

  • 这是一个很好的答案。曾经投反对票的人一定是ediot ...我看到了类型:同时发布和获取..我赞成这个..mate
  • 我不确定它是否会与这样的 url ApproveParts/ReloadCriteria 一起使用,可能只在主页(根级别)上,尝试在之前添加额外的 /
  • 感谢您的回答,原来我粘贴了错误的代码。在我的代码中,我只有 'post' 作为类型。但是,我的问题不在于这个 ajax 调用;在我进行此 ajax 调用后,相关的表行已成功更新。但是如果我提交表单更新后,我的控制器中的表单集合为空。
  • 您是否尝试添加 dataType 和 contentType 字段并如上所示发送 Json 字符串化数据?
  • 是的,我做到了;但不是 dataType:'json';我尝试了 dataType:'html' 因为我返回了 PartialViewResult。
猜你喜欢
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多