ASP.NET MVC 4不会将multipart / form-data序列化为C#对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了ASP.NET MVC 4不会将multipart / form-data序列化为C#对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3999字,纯文字阅读大概需要6分钟。
内容图文
![ASP.NET MVC 4不会将multipart / form-data序列化为C#对象](/upload/InfoBanner/zyjiaocheng/679/c55e3b63a5e640d997881d3b73e19246.jpg)
我有奇怪的问题.我有多种形式的基本CRUD操作.以下是存在问题的一种,但它们基本上都看起来像这样:
@using (Html.BeginForm((string)ViewBag.FormAction, "Groups", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.HiddenFor(vm => vm.Groep.Id)
<table>
<tbody>
<tr>
<td style="width: 150px;">@Html.LabelFor(x => x.Groep.Naam) @Html.Partial("RequiredFieldIndicator")</td>
<td>@Html.EditorFor(model => model.Groep.Naam)</td>
</tr>
<tr>
<td>@Html.LabelFor(x => x.Groep.PLCode) @Html.Partial("RequiredFieldIndicator")</td>
<td>@Html.EditorFor(model => model.Groep.PLCode)</td>
</tr>
</tbody>
</table>
<br />
<br />
<div class="actionbuttons">
@if (Model.FormEditModus == FormEditModus.Edit)
{
<button type="button" class="btn btn-default" onclick="location.href='@Url.Action("Detail", "Groups", new { id = @Model.Groep.Id })'">Terug</button>
}
@if (Model.FormEditModus == FormEditModus.Add)
{
<button type="button" class="btn btn-default" onclick="location.href='@Url.Action("Index", "Groups")'">Terug</button>
}
<button id="saveGroupButton" class="btn btn-default" type="submit">Opslaan</button>
<button type="button" class="btn btn-default" onclick="location.href='@Url.Action("Index", "Groups")'">Annuleren</button>
</div>
}
我使用的视图模型如下所示:
using Models;
namespace Admin.Models
{
public class GroupEditViewModel
{
public Groep Groep { get; set; }
//enum
public FormEditModus FormEditModus { get; set; }
}
public class Groep : ModelKeyEntity
{
[StringLength(200), Required]
public string Naam { get; set; }
[StringLength(20), Required]
public string PLCode { get; set; }
}
public abstract class ModelKeyEntity
{
public int Id { get; set; }
}
}
一切都很基本.这就是为什么在发布表单时,对MVC的操作总是收到一个空对象的原因,我感到很惊讶.更糟的是,我的所有其他表单(具有相同的设置和几乎相同的视图模型)都可以正常工作.但这是发布到控制器后的结果:
这是导致错误的POST信息:
------WebKitFormBoundaryUPb7u53aJYurdens
Content-Disposition: form-data; name="Groep.Id"
20
------WebKitFormBoundaryUPb7u53aJYurdens
Content-Disposition: form-data; name="Groep"
Models.Groep
------WebKitFormBoundaryUPb7u53aJYurdens
Content-Disposition: form-data; name="Groep.Naam"
Polantx
------WebKitFormBoundaryUPb7u53aJYurdens
Content-Disposition: form-data; name="Groep.PLCode"
PL2000x
------WebKitFormBoundaryUPb7u53aJYurdens--
我认为一切都应该是.唯一的是MVC拒绝将表单数据序列化为对象.
不用说,在这一点上我还是一无所知.有人有线索吗?
解决方法:
默认模型联编程序不能很好地处理嵌套的复杂对象.我通过编写一个简单的jQuery扩展来序列化表单数据,然后在自定义模型绑定器中使用Json.Net来解决此问题.
感觉确实很hack,但是效果很好.
这是jQuery:
$.fn.serializeToJson = function () {
var $form = $(this[0]);
var items = $form.serializeArray();
var returnObj = {};
var nestedObjectNames = [];
$.each(items, function (i, item) {
//Split nested objects and assign properties
//You may want to make this recursive - currently only works one step deep, but that's all I need
if (item.name.contains('.')) {
var nameArray = item.name.split('.');
if (nestedObjectNames.indexOf(nameArray[0]) < 0) {
nestedObjectNames.push(nameArray[0]);
}
var tempObj = returnObj[nestedObjectNames[nestedObjectNames.indexOf(nameArray[0])]] || {};
if (!tempObj[nameArray[1]]) {
tempObj[nameArray[1]] = item.value;
}
returnObj[nestedObjectNames[nestedObjectNames.indexOf(nameArray[0])]] = tempObj;
} else if (!returnObj[item.name]) {
returnObj[item.name] = item.value;
}
});
return returnObj;
};
称它为:
var data = JSON.stringify($('form').serializeToJson());
$.post(url, data).done(...
然后是活页夹:
using System.Web.Mvc;
using Newtonsoft.Json;
namespace Namespace.Web.Core.Binders
{
public class JsonBinder<T> : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var jsonString = controllerContext.RequestContext.HttpContext.Request.Params[0];
return JsonConvert.DeserializeObject<T>(jsonString);
}
}
}
并在使用中:
public ActionResult WhateverAction([ModelBinder(typeof(JsonBinder<CustomViewModel>))]CustomViewModel viewModel)
编辑:忘记提及,您可能需要对数据进行字符串化.以上更新.
内容总结
以上是互联网集市为您收集整理的ASP.NET MVC 4不会将multipart / form-data序列化为C#对象全部内容,希望文章能够帮你解决ASP.NET MVC 4不会将multipart / form-data序列化为C#对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。