@ Html.CheckBox的问题总是通过ASP.NET-MVC5 App

时间:2015-08-04 06:48:06

标签: javascript razor asp.net-mvc-5 jquery-ajaxq checkboxfor

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

enter image description here

enter image description here

模型类属性

  [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 

AdditionalTenentList

<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>

2 个答案:

答案 0 :(得分:2)

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

如果选中复选框,则应在“发布”标签中看到的内容为

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

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

我认为这是因为您使用了.serializeObject()。这不是一个原生的jQuery方法,所以要么你使用插件,要么编写自己的函数(可能像this one?)。无论如何,它都没有生成正确的帖子值。而是使用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) {

答案 1 :(得分:0)

我也遇到了这个问题,然后遇到this answer

我添加了@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) {
          //.........
     }

现在我可以接收通过复选框提交的价值。