2012-04-03 68 views
10

Tôi làm việc trên dự án ASP.net MVC đầu tiên của mình và tôi đã gặp một số vấn đề khi sử dụng nhiều biểu mẫu trong cùng một trang. Đầu tiên tôi đã tạo ra 2 lớp phần: (* Đăng ký sẽ cho phép người dùng đăng ký, * Đăng nhập nó cho phép người dùng đăng nhập.)Nhiều Biểu mẫu trong cùng một trang ASP.net MVC

Sau đó tôi được sử dụng HTML.render để tích hợp chúng trong tôi "Logpage". Vì vậy, tôi phải sử dụng 2 Hành động khác nhau. Như thế này:

 [HttpPost] 
    public ActionResult Login(LogModel.Login Model) 
    { 
     if (ModelState.IsValid) 
     { 

      if (LogModel.Login.Verifuser(Model.IDUser, Model.Password)) 
      { 
       FormsAuthentication.SetAuthCookie(Model.IDUser, false); 
       if (LogModel.Login.IsAdmin(Model.IDUser, Model.Password)) 
       { 
        return View("Admin/Index"); 
       } 
       else 
       { 
        return View("Agence/Index"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", "Invalide username or Password"); 
       return View(Model); 
      } 
     } 
     return View(Model); 
    } 

Vấn đề về trường hợp lỗi tôi chuyển hướng đến trang mới (Trang trắng chứa tóm tắt xác thực). Vì vậy, tôi tự hỏi làm thế nào để hiển thị thông báo lỗi này trong trang mặc định của tôi Trang đăng nhập.

+2

Đăng mã của bạn. Làm theo hướng dẫn định dạng để biết hướng dẫn về cách làm cho nó dễ đọc. –

+0

u có thể giải thích cho tôi không ?? – Chlebta

+0

Chính xác thì vấn đề là gì? Nếu bạn lo lắng về hành động POST của biểu mẫu, bạn chắc chắn có cả hai biểu mẫu POST cho các hành động điều khiển khác nhau. – Tuan

Trả lời

24

Bạn có thể giải quyết vấn đề này với ba hành động và một mô hình phức tạp.

public class LoginOrRegisterViewModel 
{ 
     public Models.RegisterViewModel Register { get; set; } 
     public Models.LoginViewModel Login { get; set; } 
} 


[HttpGet] 
public ActionResult Login() 
{ 
     return View("Login", new LoginOrRegisterViewModel()); 
} 

[HttpPost] 
public ActionResult Register(Models.LoginViewModel model) 
{ 
     if(!ModelState.IsValid) 
      return View("Login", new LoginOrRegisterViewModel(){ Register = model }); 
     else 
     { 
      //TODO: Validate the user 
      //TODO: Write a FormsAuth ticket 
      //TODO: Redirect to somewhere 
    } 
} 

[HttpPost] 
public ActionResult Login(Models.RegistrationViewModel model) 
{ 
     if(!ModelState.IsValid) 
      return View("Login", new LoginOrRegisterViewModel(){ Login = model}); 
     else 
     { 
      //TODO: CRUD for registering user 
      //TODO: Write forms auth ticket 
      //TODO: Redirect 
    } 
} 

Trong code của bạn, hãy chắc chắn rằng bạn thiết lập các hành động của Mẫu:

@model Models.LoginOrRegisterViewModel 

@using(Html.BeginForm("Login", "Controller", FormMethod.Post, new { id = "loginForm"})) 
{ 
     @Html.EditorFor(m => Model.Login) 
} 

@using(Html.BeginForm("Register", "Controller", FormMethod.Post, new { id = "registerForm"})) 
{ 
     @Html.EditorFor(m => Model.Register) 
} 
+2

FYI, phương thức POST thứ hai của bạn nên được gọi là Đăng ký. – Tuan

+0

Phần này "" "lớp công khai Đăng nhậpOrRegisterViewModel { Mô hình công cộng.RegisterViewModel Đăng ký {get; set;} Mô hình công cộng.LoginViewModel Đăng nhập {get; set;}" "" nơi tôi đặt nó trong Lớp mô hình của tôi ??? } – Chlebta

+0

Ngoài ra "" LoginOrRegister " – Chlebta

0

Dường như bạn cũng cần phải gọi IsAdmin tại các chi nhánh Verifyuser, để có nó trả lại đúng! view:

 if (ModelState.IsValid) 
     { 

      if (LogModel.Login.Verifuser(Model.IDUser, Model.Password)) 
      { 
       FormsAuthentication.SetAuthCookie(Model.IDUser, false); 
       if (LogModel.Login.IsAdmin(Model.IDUser, Model.Password)) 
       { 
        return View("Admin/Index"); 
       } 
       else 
       { 
        return View("Agence/Index"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", "Invalide username or Password"); 

       if (LogModel.Login.IsAdmin(Model.IDUser, Model.Password)) 
        return View("Admin/Index", Model); 
       else 
        return View("Agence/Index", Model); 

      } 
     } 

Hiện tại, bạn đang gọi điện thoại return View(Model); khi bạn có một lỗi ModelState, mà trả về giao diện mặc định cho hành động, được gọi là "Đăng nhập".

+0

Điều này đã không làm việc có confision beetwen Mô hình – Chlebta

+0

Sau đó, bạn cần phải đúc Model để các loại dự kiến ​​bằng cách xem Index, hoặc xây dựng nó, và vượt qua nó thay vì Model to View ("Admin/Index") và View ("Agence /Mục lục"). – Tuan

+0

Tôi là người mới bắt đầu, tôi có thể giải thích thêm về ASP.net MVC? tôi đã không nhận được điểm: '( – Chlebta

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