在我的ASP:NET MVC 应用程序中,我有一个如下所示的方法,我尝试将表单数据(列表中的单个项目(传递给控制器。当我在控制器中使用 POST 方法时,我还需要传递__RequestVerificationToken。我看过很多关于堆栈溢出的主题,但没有一个能解决这个问题。
剃刀:
@model IEnumerable<DemoViewModel>
@using (Html.BeginForm("Save", "Employee", FormMethod.Post,
new { id = "frmEmployee", enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@foreach (var item in Model)
{
@item.Name
@item.Surname
@item.Town
<!-- code omitted for brevity -->
}
}
<a href="javascript:save();">
Save
</a>
<script>
function save() {
var selectedEmpId = 0;
var employeeList = @Html.Raw(Json.Encode(Model));
var employee = employeeList.filter(function (e) { return e.Id === selectedEmpId; });
var formdata = JSON.stringify({employee});
var token = $('[name=__RequestVerificationToken]').val();
$.ajax({
type: "POST",
url: '@Url.Action("Save", "Employee")',
cache: false,
dataType: "json",
data: { model: formdata, __RequestVerificationToken: token },
//I also tried to add this
//contentType: "application/json; charset=utf-8",
});
};
</script>
另一方面,通常我会使用var formdata = $('#frmEmployee').serialize();
或var formdata = new FormData($('#frmEmployee').get(0));
但在此示例中,我需要从列表中获取单个数据而不是表单数据。
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Save([Bind(Exclude = null)] DemoViewModel model)
{
if (ModelState.IsValid)
{
//stuff
}
}
将数据传递给控制器模型变量为空或尝试某些内容时,模型的值为空。有什么想法可以解决问题吗?
通过过滤数组,您将获得具有一个员工项的数组结果,并且在控制器操作时需要一个对象而不是数组/列表。所以传递过滤列表的第一个元素或更好地使用查找方法,
var employee = employeeList.find(e => e.Id === selectedEmpId);
var formdata = JSON.stringify(employee);
并发布它
$.ajax({
type: "POST",
url: '@Url.Action("Save", "Employee")',
cache: false,
dataType: "json",
data: formdata,
contentType: 'application/json; charset=utf-8',
//....success,error functions
});
这应该在操作方法中正确绑定模型。如果在绑定中仍然遇到问题,则可以将 FromBody 属性与参数一起使用。
最后,我使用以下方法解决了这个问题。因此,任何需要在MVC 中将 JSON 转换为 ViewModel ASP.NET的人都可以使用以下方法:
视图:
$.ajax({
type: "POST",
url: '@Url.Action("Save", "DemoContoller")',
cache: false,
dataType: "json",
data: { json: JSON.stringify(demoData), "__RequestVerificationToken":
$('input[name=__RequestVerificationToken]').val() },
//...
});
控制器:
public ActionResult Save(string json)
{
IList<DemoViewModel> model = new
JavaScriptSerializer().Deserialize<IList<DemoViewModel>>(json);
//or
List<DemoViewModel> model = new
JavaScriptSerializer().Deserialize<List<DemoViewModel>>(json);
}