2015-07-03 16 views
5

Tôi đang cố đăng nhập và đăng ký biểu mẫu vào cùng một chế độ xem. Tôi đã làm tất cả mọi thứ được đề xuất trong các câu hỏi khác nhưng vấn đề của tôi vẫn không cố định.MVC Nested View Model with Validation

Đây là quan điểm của bố mẹ tôi authentication.cshtml:

@model Eriene.Mvc.Models.AccountVM 
    <div class="row"> 
     <div class="col-md-6"> 
      @Html.Partial("_Login", Model.Login ?? new Eriene.Mvc.Models.LoginVM()) 
     </div> 
     <div class="col-md-6"> 
      @Html.Partial("_Register", Model.Register ?? new Eriene.Mvc.Models.RegisterVM()) 
     </div> 
    </div> 

Trong partials của tôi, tôi sử dụng các hình thức như thế này:

@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @id = "login-form", @role = "form", @class = "login-form cf-style-1" })) 

Một trong những hành động là như thế này:

[HttpPost] 
[AllowAnonymous] 
public ActionResult Register(RegisterVM registerVM) 
{ 
    if (ModelState.IsValid) 
    { 
     User user = new Data.User(); 
     user.Email = registerVM.Email; 
     user.ActivationCode = Guid.NewGuid().ToString(); 
     user.FirstName = registerVM.FirstName; 
     user.LastName = registerVM.LastName; 
     user.Password = PasswordHelper.CreateHash(registerVM.Password); 
     return RedirectToAction("Index", "Home"); 
    } 

    return View("Authentication", new AccountVM() { Register = registerVM }); 
} 

Và đây là các mô hình tôi đang sử dụng:

public class AccountVM 
{ 
    public LoginVM Login { get; set; } 
    public RegisterVM Register { get; set; } 
} 

public class RegisterVM 
{ 
    [Required] 
    public string Email { get; set; } 

    [Required] 
    public string FirstName { get; internal set; } 

    [Required] 
    public string LastName { get; internal set; } 

    [Required] 
    public string Password { get; internal set; } 

    [Compare] 
    public string PasswordRetype { get; internal set; } 
} 

public class LoginVM 
{ 
    [Required] 
    public string Email { get; set; } 

    [Required] 
    public string Password { get; set; } 

    public bool RememberMe { get; set; } 
} 

Trong sổ đăng ký hành động, thuộc tính Email của VM có giá trị nhưng một số khác là null. ModelState.IsValidfalse. Tôi đang làm gì sai?

Trả lời

3

tính của bạn không bị ràng buộc bởi vì họ không có setters công cộng (chỉ nội bộ) có nghĩa là DefaultModelBinder không thể để họ ra đi (vì thế họ là null và không hợp lệ do [Required] thuộc tính. Thay đổi

public string FirstName { get; internal set; } 

để

public string FirstName { get; set; } 

và như trên cho tất cả các tài sản khác với setters nội bộ.

+0

Thiên Chúa! tôi tạo tha t properteis bằng cách tái cấu trúc, tôi không biết chúng là nội bộ. Xin lỗi vì điều vô nghĩa này. Cảm ơn bạn rất nhiều! –

Các vấn đề liên quan