回发到控制器的ViewModel为null

mmz*_*mmz 1 model-view-controller asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

我试图搜索这个问题,但无法找到解决方案,请帮助我:

我的viewModel:

namespace webShop.ViewModels.Home
{
    public class RegisterUserViewModel
    {
        public UserDB User { get; set; }

        public UsersDetaile UsersDetaile { get; set; }

        public IEnumerable<state> state { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的模特:

public partial class UserDB
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string Roles { get; set; }
    public byte Status { get; set; }

    public virtual UsersDetaile UsersDetaile { get; set; }
}

public partial class UsersDetaile
{
    public int userID { get; set; }
    public Nullable<System.DateTime> BirthDate { get; set; }
    public string Mobile { get; set; }
    public string Tell { get; set; }
    public bool Gender { get; set; }
    public byte city { get; set; }
    public byte state { get; set; }
    public string postCode { get; set; }
    public string address { get; set; }

    public virtual City City1 { get; set; }
    public virtual State State{ get; set; }
    public virtual UserDB UserDB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和我的控制器:

[HttpGet]
public ActionResult Register()
{ 
    stateRepository stateRep = new stateRepository();
    var model = new RegisterUserViewModel();
    model.state = stateRep.Select().ToList();
    return View(model);
}

[HttpPost]
public ActionResult Register(RegisterUserViewModel user) //Problem: postback viewModel is null
{
   //My Code
}
Run Code Online (Sandbox Code Playgroud)

和我的注册视图

@model webShop.ViewModels.Home.RegisterUserViewModel

@using (Ajax.BeginForm("Register", "Home", new AjaxOptions { HttpMethod = "Post", Url = "/Home/Register" }))
{

  @Html.AntiForgeryToken()
  @Html.ValidationSummary(true)
  <h1 class="block-header">Register</h1>
      <div class="group">
          <label class="label">Name <span class="required">*</span></label>
          <div class="controls">
              @Html.TextBoxFor(p => p.User.Name, new { @class = "text" })
              @Html.ValidationMessageFor(p => p.User.Name)
          </div>
      </div>

    //....

  <div class="group">
        <label class="label">Address </label>
        <div class="controls">
            @Html.TextBoxFor(p => p.UsersDetaile.address, new { @class = "text" })
            @Html.ValidationMessageFor(p => p.UsersDetaile.address)
        </div>
  </div>

  <div class="form">
    <div class="group">
        <div class="controls">
             <button class="button">Submit</button>
        </div>
    </div>
  </div>
}
Run Code Online (Sandbox Code Playgroud)

按提交后,userDBusersDetailenull,我该怎么办?

Rom*_*ias 7

当您具有复杂类型的ViewModel时...... 您需要调用复杂属性的默认构造函数.

public class RegisterUserViewModel
{

    public RegisterUserViewModel() {
        User = new UserDB();
        UsersDetaile = new UsersDetaile();
    }

    public UserDB User { get; set; }

    public UsersDetaile UsersDetaile { get; set; }

    public IEnumerable<state> state { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这样,活页夹可以加载属性值.你不需要任何其他东西.

至少看起来很奇怪的一件事是,您的ViewModel具有一个名为UsersDetaile与该类型同名的属性 .同样的财产在里面UserDB.这可能会使您和活页夹容易出错.

  • 你不**需要添加一个初始化复杂属性的默认构造函数(默认情况下`DefaultModelBinder`执行此操作)!问题是POST方法的参数名为`user`,视图模型也有一个名为`user`的属性,因此无法绑定.将方法签名更改为`public ActionResult Register(RegisterUserViewModel model)` - 或其他任何名称属性的名称 - 它将正常工作. (3认同)