1

我试图通过 jQuery Ajax 函数以 JSON 格式发布数据,这工作正常,但是我有布尔值并使用 html.checkBoxFor 即使我检查它也总是发布错误。我在 javaScript 中更新了代码,如果检查与否,我会相应地强制更改隐藏的输入值,我可以在调试中看到单击时发布 true 但在控制器端仍收到 false 的情况。在附加的屏幕截图中,您可以在控制器上看到正确的值,但不是错误的值

在此处输入图像描述

在此处输入图像描述

模型类属性

  [Display(Name = "Secure Entire Property")]
  [Required(ErrorMessage = "Require Information on If You Want to Secure Entire Property")]
  public bool SecureEntireProperty { get; set; }

剃刀代码

<div class="form-group">
   @Html.LabelFor(model => model._RentingApplicationModel.SecureEntireProperty, htmlAttributes: new { @class = "control-label col-md-2" })
 <div class="col-md-10">
    <div class="checkbox">
     @*@Html.EditorFor(model => model._RentingApplicationModel.SecureEntireProperty)*@
     @Html.CheckBoxFor(model => model._RentingApplicationModel.SecureEntireProperty, new { @id = "SecureEntirePropertyCheck" })
     @Html.ValidationMessageFor(model => model._RentingApplicationModel.SecureEntireProperty, "", new { @class = "text-danger" })
       </div>
    </div>
  </div>

JavaScript

 $("#SecureEntirePropertyCheck").click(function () {

    if ($(this).is(':checked'))
    {
        $('[name="_RentingApplicationModel.SecureEntireProperty"]:hidden').val(true);
    }
    else
    {
        $('[name="_RentingApplicationModel.SecureEntireProperty"]:hidden').val(false);
    }
});

我在哪里发布的 Jquery Ajax 方法

 $.ajax({
        url: formURL,
        type: "POST",
        dataType: "application/json",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify({ TenentJSONList: AdditionalTenentList, ApplicationModelData: $("#CreateStudentRentingApplicationForm").serializeObject() }),
    }).done(function (data, textStatus, jqXHR) {
        //....my rest of code 

附加租户列表

<script type="text/javascript">

 var AdditionalTenentList = new Array();

 $(".additionalTententUWLID").on("change", function () {

 var StudentUWLID = $(this).val();

 $(this).attr('id', StudentUWLID);

 $.ajax({
        url: '@Url.Action("GetStudentRecordByID", "StudentProfile")',
            type: "POST",
            dataType: "JSON",
            data: { _GivenStudentUWLID: StudentUWLID },
            cache: false
        }).done(function (data, textStatus, jqXHR) {

            if (data.RecordStatus == "NotAvailable")
            {
                alert("error");
            }
            else if(data.RecordStatus=="recordFound")
            {
               // alert(data.Response);

                var paraedData = JSON.parse(data.Response);

                AdditionalTenentList.push(StudentUWLID);
           ....my rest of code
</script>
4

2 回答 2

2

您的问题是您发布了SecureEntireProperty属性值的数组,并且boolean属性不能绑定到数组。

如果选中该复选框,您应该在“发布”选项卡中看到的是

....
_RentingApplicationModel.SecureEntireProperty: true
_RentingApplicationModel.SecureEntireProperty: false
....

如果未选中,则只是第二个。读取第DefaultModelBinder一个 ( true) 的值并设置属性。它忽略匹配相同属性的任何后续值。

我认为这是因为您使用了.serializeObject(). 这不是原生的 jQuery 方法,因此您要么使用插件,要么编写自己的函数(可能类似于这个?)。在任何情况下,它都不会生成正确的帖子值。而是使用 jQuery.serialize()函数来序列化表单值。因为您还发布了一个额外的值数组,所以您需要将代码修改为

var data = $('#CreateStudentRentingApplicationForm').serialize() + '&' + $.param({ 'TenentJSONList': AdditionalTenentList }, true);

$.ajax({
    url: formURL,
    type: "POST",
    dataType: "application/json",
    data: data,
}).done(function (data, textStatus, jqXHR) {
于 2015-08-04T10:14:52.760 回答
0

我也遇到过这个问题,然后我遇到了这个答案

我添加了@Name 属性如下

@Html.CheckBoxFor(m => m.IsPresent, new { @Name = "customName"})

此语句覆盖使用 @Html.CheckBoxFor 生成的名称

如果您看到@Html.CheckBoxFor 生成的html 代码,您将看到生成了两个输入标记。所以我刚刚删除了@Name 属性,我能够使用 Ajax 提交请求,如下所示:

if ($(this).valid()) {
   $.ajax({
     url: this.action,
     type: this.method,
     data: $(this).serialize(),
     traditional: true,
     success: function (data) {
          //.........
     }

现在我能够接收通过复选框提交的值。

于 2020-05-23T19:21:47.447 回答