Asp.net mvc 是什么导致ASP.NET MVC表单无法正确提交/反序列化?
这看起来应该可以工作,但是表单提交时模型没有正确反序列化。正在使用nuget提供的最新ASP.NET MVC。净额4.5 非常标准的用户注册视图/控制器 视图: Autofac通常可以正常工作,因为控制器已正确实例化,并注入了属性依赖项 编辑2: 根据建议,通过继承DefaultModelBinder创建了一个自定义绑定,以便我可以看到转换。看起来bindingContenxt的模型为空 视图模型本身如下所示:Asp.net mvc 是什么导致ASP.NET MVC表单无法正确提交/反序列化?,asp.net-mvc,Asp.net Mvc,这看起来应该可以工作,但是表单提交时模型没有正确反序列化。正在使用nuget提供的最新ASP.NET MVC。净额4.5 非常标准的用户注册视图/控制器 视图: Autofac通常可以正常工作,因为控制器已正确实例化,并注入了属性依赖项 编辑2: 根据建议,通过继承DefaultModelBinder创建了一个自定义绑定,以便我可以看到转换。看起来bindingContenxt的模型为空 视图模型本身如下所示: public class RegisterViewModel { [Requi
public class RegisterViewModel
{
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
[Required]
public string Email { get; set; }
[Required]
public string LastName { get; set; }
[Required]
public string FirstName { get; set; }
}
经过一整天的trubleshooting、更新所有nuget软件包、确保web.config都很紧,并且包含正确的程序集重定向、整洁的路由,甚至修复.NET framework和其他耗时且不相关的活动,我终于明白了这一点: 几周前,我们引入了Autofac绑定,它将捕获序列化的HttpContext以及日志框架需要的其他相关数据。(想象一下,能够将请求信息与业务对象内的完整异常堆栈一起记录,而不会用会话/记录数据污染业务逻辑。) 不幸的是,作为绑定创建的一部分,HttpContext被Json.net序列化,不是在记录事件时,而是在绑定时 显然,当Json.net Seralize HttpContext时,它实际上是第一次读取其中的流,导致读取提交的表单数据,因此当控制器实例化并发布其数据时,这些流已经被读取并请求。form Collection为空
仅创建委托以序列化HttpContext的简单修复似乎已修复此问题请检查
ModelState
错误集合。是否存在任何ModelState错误?如果从表单和操作中物理删除AntiForgeryToken,模型是否正确绑定?您是否指定了自定义模型绑定器,或仅指定了默认的auto magic实现?问题的答案已编辑到线程中您的RegisterViewModel是否定义了getter和setter?模型绑定器正在执行哪些类型的转换(您也可以共享此代码)?另外,我假设您正在使用DataAnnotations
属性来根据需要标记字段。由于这似乎正在工作(基于ModelState错误),因此断开连接似乎与模型绑定器本身有关。如果是自定义的,那么代码会有所帮助;如果不是,那么请尝试为RegisterViewModel创建一个自定义的,这样您就可以逐步完成绑定并将表单字段与模型名称进行比较。
// POST: /Account/Register
[AcceptVerbs(HttpVerbs.Post)]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new User
{
UserName = model.UserName,
FirstName = model.FirstName,
LastName = model.LastName
};
user.SetEmail(model.Email);
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
_bus.Publish(new UserCreated(user));
await SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
return View(model);
}
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterModelBinderProvider();
public class RegisterViewModel
{
[Required]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
[Required]
public string Email { get; set; }
[Required]
public string LastName { get; set; }
[Required]
public string FirstName { get; set; }
}