Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 是什么导致ASP.NET MVC表单无法正确提交/反序列化?_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 是什么导致ASP.NET MVC表单无法正确提交/反序列化?

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

这看起来应该可以工作,但是表单提交时模型没有正确反序列化。正在使用nuget提供的最新ASP.NET MVC。净额4.5

非常标准的用户注册视图/控制器

视图:

Autofac通常可以正常工作,因为控制器已正确实例化,并注入了属性依赖项

编辑2: 根据建议,通过继承DefaultModelBinder创建了一个自定义绑定,以便我可以看到转换。看起来bindingContenxt的模型为空

视图模型本身如下所示:

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; }
}