我试图通过jQuery Ajax函数以JSON格式发布数据,工作正常,但我有一个bool值,并使用html.checkBoxFor,它总是发布false,即使我检查它。我在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>
$("#SecureEntirePropertyCheck").click(function () {
if ($(this).is(':checked'))
{
$('[name="_RentingApplicationModel.SecureEntireProperty"]:hidden').val(true);
}
else
{
$('[name="_RentingApplicationModel.SecureEntireProperty"]:hidden').val(false);
}
});
$.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>
你的问题是,你发布的是一个数组的值,为 SecureEntireProperty
财产和a boolean
属性不能绑定到一个数组。
如果勾选了复选框,你应该在 "发布 "选项卡中看到的是
....
_RentingApplicationModel.SecureEntireProperty: true
_RentingApplicationModel.SecureEntireProperty: false
....
如果没有选中,则只需选中第二个。的 DefaultModelBinder
读取第一个值(true
)并设置该属性。它忽略任何与相同属性匹配的后续值。
我想这是因为你使用了 .serializeObject()
. 这不是一个原生的jQuery方法,所以要么你使用一个插件,要么你已经写了自己的函数(也许类似于 这个?). 在任何情况下,它都不会生成正确的post值。相反,使用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) {
我也曾面临这个问题,后来我遇到了 本回答
我已经添加了@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) {
//.........
}
现在我能够接收通过checkbox提交的值。