@Html.CheckBoxFor 的问题总是通过 ASP.NET-MVC5 应用程序中的 $.Ajax Post 方法发布错误
Issue with @Html.CheckBoxFor always posting false via $.Ajax Post Method in ASP.NET-MVC5 App
我试图通过 jQuery Ajax 函数以 JSON 格式获取 post 数据,但我有 bool 值并使用 html.checkBoxFor即使我检查它也总是 posting 错误。我在 javaScript 中有更新代码,如果检查或不检查,我会相应地强制更改隐藏的输入值,我可以在调试中看到单击时 posting 为真,但在控制器端仍然收到 false。在随附的屏幕截图中,您可以看到 post 控制器上的正确值,但不是错误值
型号Class属性
[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>
您的问题是您 post 为 SecureEntireProperty
属性 和 boolean
属性 设置的值数组无法绑定到数组.
如果选中该复选框,您应该在 'Post' 选项卡中看到的内容是
....
_RentingApplicationModel.SecureEntireProperty: true
_RentingApplicationModel.SecureEntireProperty: false
....
如果未选中,则为第二个。 DefaultModelBinder
读取第一个 (true
) 的值并设置 属性。它忽略匹配相同 属性.
的任何后续值
我认为这是因为您使用了 .serializeObject()
。这不是本机 jQuery 方法,因此您要么使用插件,要么编写自己的函数(可能类似于 this one?)。在任何情况下,它都不会生成正确的 post 值。而是使用 jQuery .serialize()
函数来序列化表单值。因为您还 post 添加了一个额外的值数组,所以您需要将代码修改为
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) {
//.........
}
现在我可以接收通过复选框提交的值。
我试图通过 jQuery Ajax 函数以 JSON 格式获取 post 数据,但我有 bool 值并使用 html.checkBoxFor即使我检查它也总是 posting 错误。我在 javaScript 中有更新代码,如果检查或不检查,我会相应地强制更改隐藏的输入值,我可以在调试中看到单击时 posting 为真,但在控制器端仍然收到 false。在随附的屏幕截图中,您可以看到 post 控制器上的正确值,但不是错误值
型号Class属性
[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>
您的问题是您 post 为 SecureEntireProperty
属性 和 boolean
属性 设置的值数组无法绑定到数组.
如果选中该复选框,您应该在 'Post' 选项卡中看到的内容是
....
_RentingApplicationModel.SecureEntireProperty: true
_RentingApplicationModel.SecureEntireProperty: false
....
如果未选中,则为第二个。 DefaultModelBinder
读取第一个 (true
) 的值并设置 属性。它忽略匹配相同 属性.
我认为这是因为您使用了 .serializeObject()
。这不是本机 jQuery 方法,因此您要么使用插件,要么编写自己的函数(可能类似于 this one?)。在任何情况下,它都不会生成正确的 post 值。而是使用 jQuery .serialize()
函数来序列化表单值。因为您还 post 添加了一个额外的值数组,所以您需要将代码修改为
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) {
//.........
}
现在我可以接收通过复选框提交的值。