4

我有一個索引頁,它有兩個部分視圖:登錄和註冊。我正在使用數據模型驗證。驗證在部分視圖中不起作用

Login.cshtml

@model Project.ViewModel.UserModel 

<div style="position:inherit;"> 
@using (Html.BeginForm("_Login", "account")) 
{ 
    @Html.ValidationSummary(true) 
    <div class="label">@Html.Label("Username")</div> 
    <div class="field">@Html.TextBoxFor(m => m.Username)</div> 
    <div class="error">@Html.ValidationMessageFor(model => model.Username)</div> 

    <div class="label">@Html.Label("Password")</div> 
    <div class="field">@Html.PasswordFor(m => m.Password)</div> 
    <div class="error">@Html.ValidationMessageFor(model => model.Password)</div> 

    <input class="field" id="submit" type="submit" value="Login" /> 
} 

Register.cshtml

@model Project.ViewModel.UserModel 

<link href="~/Content/Site.css" rel="stylesheet" /> 
<div style="position: inherit; margin-top: 20px"> 
@using (Html.BeginForm("_Register","account")) 
{ 
    <div class="label">@Html.Label("Name")</div> 
    <div class="field">@Html.TextBoxFor(m => m.FullName)</div> 
    <div class="error">@Html.ValidationMessageFor(model => model.FullName)</div> 

    <div class="label">@Html.Label("Username")</div> 
    <div class="field">@Html.TextBoxFor(m => m.Username)</div> 
    <div class="error">@Html.ValidationMessageFor(model => model.Username)</div> 

    <div class="label">@Html.Label("Password")</div> 
    <div class="field">@Html.PasswordFor(m => m.Password)</div> 
    <div class="error">@Html.ValidationMessageFor(model => model.Password)</div> 

    <div class="label">@Html.Label("Confirm Password")</div> 
    <div class="field">@Html.PasswordFor(m => m.ConfirmPassword)</div> 
    <div class="error">@Html.ValidationMessageFor(model => model.Password)</div> 

    <div class="label">@Html.Label("Email")</div> 
    <div class="field">@Html.TextBoxFor(m => m.Email)</div> 
    <div class="error">@Html.ValidationMessageFor(model => model.Email)</div> 

    <div class="label">@Html.Label("Country")</div> 
    <div class="field">@Html.TextBoxFor(m => m.Country)</div> 
    <div class="error">@Html.ValidationMessageFor(model => model.Email)</div> 

    <input class="field" id="submit" type="submit" value="Sign Up" /> 
    @Html.ValidationSummary() 
} 

Index.cshtml

@model Project.ViewModel.UserModel 
@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<div id="regiserandlogin"> 
<div id="registerandlogin-header"> 
    <label style="margin-left:50px;">Sign Up For Free!!!</label> 
    <label style="margin-left:350px;color:#28a1e2">Already Have An Account?</label> 
    </div> 
    <div id="registerbox"> 
     @Html.Partial("_Register", new ProjectHub.ViewModel.UserModel()) 
    </div> 
    <div id="loginbox"> 
     @Html.Partial("_Login", new ProjectHub.ViewModel.UserModel()) 
    </div> 

public ViewResult _Register() 
    { 
     return View("_Register"); 
    } 
    [HttpPost] 
    public ActionResult _Register(UserModel usermodel) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View("Index"); 
     } 
     try 
     { 
      FormsAuthentication.SetAuthCookie(usermodel.Username, false); 
      return RedirectToAction("activationemail", new {username= Username}); 
     } 
     catch (Exception ae) 
     { 
      ModelState.AddModelError("", ae.Message); 
      return View(); 
     } 
    } 
    public ViewResult _Login() 
    { 
     return View("_Login"); 
    } 
    [HttpPost] 
    public ActionResult _Login(string username, string password) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(username, password)) 
      { 
       if (!repository.IsVerified(username)) 
       { 
        ModelState.AddModelError("","Account is not activated.; 
        return View(); 

       } 
       FormsAuthentication.SetAuthCookie(username,false); 
        return RedirectToAction("Index","Home"); 

      } 
      return RedirectToAction("Index", "account"); ;  
     } 
     else 
     { 
      ModelState.AddModelError("","Invalid Username/Password"); 
      return View(); 
     } 
    } 

UserModel.cs

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 

namespace ProjectHub.ViewModel 
{ 
    public class UserModel 
    { 
     [Required(ErrorMessage="Username is Required")] 
     public string Username { get; set; } 
     [Required(ErrorMessage = "Password is Required")] 
     public string Password { get; set; } 
     [Required(ErrorMessage = "Password is Required")] 
     public string ConfirmPassword { get; set; } 
     [Required(ErrorMessage = "Name is Required")] 
     public string FullName { get; set; } 
     [Required(ErrorMessage = "Email is Required")] 
     public string Email { get; set; } 
     [Required(ErrorMessage = "Country is Required")] 
     public string Country { get; set; } 
    } 
} 

當我按這樣的註冊按鈕,我得到a validation error

enter image description here

如果我使用RedirectToAction方法,我不明白驗證錯誤。 請幫助我,不要因爲我的上一個帳戶被阻止而無法評論。

+0

請回答我的問題,我卡住了,不能proceed.Please幫我 – 2013-02-23 12:26:25

+0

顯示你的模型'Project.ViewModel.UserModel' – Yasser 2013-02-23 12:43:47

+0

@阿拉法特,先生,我已經添加的usermodel also.Sir,居然在這裏,當我嘗試發佈一種方法,其他post方法也正在執行。請指導我 – 2013-02-23 12:51:59

回答

3

您不應該爲兩個部分使用相同的視圖模型。你應該有2種不同的視圖模型。

例如:

public class LoginViewModel 
{ 
    [Required(ErrorMessage="Username is Required")] 
    public string Username { get; set; } 

    [Required(ErrorMessage = "Password is Required")] 
    public string Password { get; set; } 
} 

和用於寄存器部分:

public class RegisterViewModel 
{ 
    [Required(ErrorMessage="Username is Required")] 
    public string Username { get; set; } 

    [Required(ErrorMessage = "Password is Required")] 
    public string Password { get; set; } 

    [Required(ErrorMessage = "Password is Required")] 
    public string ConfirmPassword { get; set; } 

    [Required(ErrorMessage = "Name is Required")] 
    public string FullName { get; set; } 

    [Required(ErrorMessage = "Email is Required")] 
    public string Email { get; set; } 

    [Required(ErrorMessage = "Country is Required")] 
    public string Country { get; set; } 
} 

然後你的主視圖模型應該聚合這些2視圖模型:

public class MyViewModel 
{ 
    public LoginViewModel Login { get; set; } 
    public LoginViewModel Register { get; set; } 
} 

然後:

<div id="registerbox"> 
    @Html.Partial("_Register", Model.Login) 
</div> 
<div id="loginbox"> 
    @Html.Partial("_Login", Model.Register) 
</div> 
+0

我也試過這個。但是,同樣的錯誤。我認爲它應該是返回類型的註冊和登錄控制器。我想重定向到相同的頁面,即。帳戶/索引,但是,它得到帳戶/註冊或/登錄。請幫助我 – 2013-02-23 17:49:58

+0

事實上,mvc項目模板也內置這兩種視圖模型。 – Yasser 2013-02-24 04:55:26

+0

@Darin Dimitrov,我在「new Model.Login」和「new Model.Register」中遇到錯誤 – 2013-02-24 09:15:57

1

將以下引用添加到View中的JQuery腳本。
我經歷了同樣的情況,它解決了我的問題。

"~/Scripts/jquery.unobtrusive*" 
"~/Scripts/jquery.validate*"