使用一个表单,用户应该能够取消选中预选checkbox
并将该状态保存在AJAX
post through JSON
object 到Controller
inASP.Net MVC
要求:
- 取消选中预先选择的复选框应将数据库属性中的一行从“Active” = 'Y' 更改为“Active=" = 'N'
- 新选择的复选框将在数据库中创建一个完整的新行
问题:
- 取消选中所选文本框后,模型未在 中更新
VIEW
。因此服务器端数据不会更新。AJAX
在将数据解析为调用之前需要客户端更新。 - 不知道如何捕获复选框值更改并将其传递给模型,以便解析数据可以更改为按钮单击/提交表单。
- 以下代码也给出了错误 200,因为 dataType 在提交时被认为是不正确的(在此处执行按钮提交)。
看法:
@model List<DashboardPermissionTool.ViewModels.UserViewModel>
@using (@Html.BeginForm(new { id = "UserForm" }))
{
<table class="table">
<tr>
<th>User</th>
@for (int i = 0; i < Model[0].Roles.Count; i++)
{
<th>
@Model[0].Roles[i].RoleName
</th>
}
</tr>
@for (int i = 0; i < Model.Count; i++)
{
<tr>
<td>
@Html.HiddenFor(m => m[i].UserName)
@Model[i].UserName
</td>
@for (int j = 0; j < Model[i].Roles.Count; j++)
{
<td>
@Html.CheckBoxFor(m => m[i].Roles[j].IsSelected)
</td>
}
</tr>
}
</table>
<div class="form-actions">
<a id="SubmitUserRoles" class="btn btn-success submit" value="Save">Save changes</a>
</div>
<script>
var parsedData = @Html.Raw( new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model));
$(document).ready(function() {
$("#SubmitUserRoles").click(function () {
$('input[type=checkbox]').on("change",function(){
if($(this).prop('checked'))
{
$(this).attr('checked', false);
}
else
{
$(this).attr('checked', true);
}
});
$.ajax({
url: '@Url.Action("Create", "User")',
type: 'POST',
contentType: 'application/json; charset=utf-8',
cache: false,
dataType: 'json',
data: JSON.stringify(parsedData),
success: function (data) {
console.log(data);
}, error: function (xhr, ajaxOptions, error) {
alert(xhr.status);
alert("Error: " + xhr.responseText);
}
});
});
});
</script>
}
HTML 响应: : 对于每个选中的复选框响应如下:
<td>
<input checked="checked" data-val="true" data-val-required="The IsSelected field is required." name="[0].Roles[0].IsSelected" type="checkbox" value="true" />
<input name="[0].Roles[0].IsSelected" type="hidden" value="false" />
</td>
对于每个未选中的复选框,响应如下:
<td>
<input data-val="true" data-val-required="The IsSelected field is required." name="[0].Roles[1].IsSelected" type="checkbox" value="true" />
<input name="[0].Roles[1].IsSelected" type="hidden" value="false" />
</td>
视图模型:
public class UserViewModel
{
public string UserName { get; set; }
public List<RoleViewModel> Roles { get; set; }
}
public class RoleViewModel
{
public string RoleName { get; set; }
public bool IsSelected { get; set; }
}
控制器:
[HttpPost]
public ActionResult Create(List<UserViewModel> model)
{
for (int i = 0; i < model.Count; i++)
{
for (int j = 0; j < model[i].Roles.Count; j++)
{
db.User.Add(new User
{
username = model[i].UserName,
role = model[i].Roles[j].RoleName
});
}
db.SaveChanges();
return RedirectToAction("Index", "User");
}
return View("Index", model);
}