2015-11-02 9 views
2

Я искал и пытался решить проблему, с которой я сталкиваюсь прямо сейчас. Я являюсь моделью пользователя, и я хочу аутентифицировать пользователя с помощью пользовательского authentication.I'm не видя никаких ошибок при подаче form.But я могу видеть исключение в выходе window.Here моя модель класса:Первое случайное исключение типа «Исключение System.NullReferenceException» произошло в пользовательской аутентификации Unknown Module-mvc

public class UserInfo 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    [Required(ErrorMessage="User Name is required")] 
    [Display(Name="User Name")] 
    [MaxLength(20, ErrorMessage = "The Maximum length allowed is 20 characters")] 
    [MinLength(4, ErrorMessage = "The Minimum length is 3 characters")] 
    public string Name { get; set; } 

    [Required(ErrorMessage = "Email is required")] 
    [EmailAddress(ErrorMessage = "Enter a proper email address")] 
    [MaxLength(30, ErrorMessage = "Maximum length allowed for an email is 30 characters")] 
    public string Email { get; set; } 

    [Required(ErrorMessage = "Password is required")] 
    [Display(Name = "Password")] 
    [DataType(DataType.Password)] 
    public string Pass { get; set; } 

    [Required(ErrorMessage = "Confirm your password")] 
    [Display(Name = "Confirm Password")] 
    [Compare("Pass", ErrorMessage = "Passwords should match")] 
    [DataType(DataType.Password)] 
    [NotMapped] 
    public string Confirm { get; set; } 
} 

Вот мой метод действия для входа в систему в моем контроллере:

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Login(UserInfo user) 
     { 
      if (ModelState.IsValid) 
      { 

        string EncryptPass; 
        EncryptPass = Crypto.SHA256(user.Pass); 
        Console.WriteLine(EncryptPass); 
        var i = db.Database.ExecuteSqlCommand("select count(*) 
        from userinfos where username = {0}", user.Name); 
        if (i > 0) 
        { 
         var j = db.Database.ExecuteSqlCommand("select 
       count(*) from userinfos where pass = {0}", EncryptPass); 
         if (j > 0) 
         { 
          Session["User"] = user.Name; 
          FormsAuthentication.SetAuthCookie(user.Name, 
          false); 
          RedirectToAction("Create", "Ministry"); 
         } 
         else 
         { 
          RedirectToAction("Login"); 
          ModelState.AddModelError(user.Pass, "Password is 
          incorrect"); 

         } 
        } 
        else 
        { 
         RedirectToAction("Login"); 
         ModelState.AddModelError(user.Name, "Our records 
          shows 
           that no account exists on your name"); 
        } 

      } 
      return View(); 
     } 

Мой взгляд:

@model ChurchWebsite.Models.UserInfo 

@{ 
    ViewBag.Title = "Login"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Login</h2> 

@using (Html.BeginForm()) { 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend></legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div>  
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Pass) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Pass) 
      @Html.ValidationMessageFor(model => model.Pass) 
     </div> 


     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 



@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+1

Какая строка выдает ошибку? И 'ModelState' всегда будет недействительным из-за вашего' [Compare («Pass», ErrorMessage = «Пароли должны совпадать»)] '. И в чем смысл добавления ошибок ModelState после вызова RedirectToAction(); '? –

+0

Должен ли я рассмотреть возможность создания отдельного контроллера для входа и записи ActionMethod для входа в этот контроллер? –

ответ

0

Благодарим вас @ Stephen за постоянное усилие, чтобы помочь мне. Я создал модель с именем пользователя и паролем атрибуты

public class User 
    { 
     [Required(ErrorMessage = "User Name is required")] 
     [Display(Name = "User Name")] 
     [MaxLength(20, ErrorMessage = "The Maximum length allowed is 20 
     characters")] 
     [MinLength(4, ErrorMessage = "The Minimum length is 3 characters")] 
     public string Name { get; set; } 

     [Required(ErrorMessage = "Password is required")] 
     [Display(Name = "Password")] 
     [DataType(DataType.Password)] 
     public string Pass { get; set; } 
    } 

я добавил контроллер для модели «Пользователь»

public ActionResult Login() 
     { 
      return View(); 
     } 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Login(User l,string ReturnUrl="") 
     { 

       string EncodedPass; 
       EncodedPass = Crypto.SHA256(l.Pass); 

       var user = db.UserInfo.Where(a => a.Name.Equals(l.Name) && 
       a.Pass.Equals(EncodedPass)).FirstOrDefault(); 
       if (user != null) 
       { 
        FormsAuthentication.SetAuthCookie(l.Name, false); 
        if (Url.IsLocalUrl(ReturnUrl)) 
        { 
         return Redirect(ReturnUrl); 
        } 
        else 
        { 
         return RedirectToAction("Create", "Ministry"); 
        } 
       } 

      ModelState.Remove("Password"); 
      return View(); 

     } 

я добавил представление для описанного выше способа действия, и теперь это Работа Хорошо

 Смежные вопросы

  • Нет связанных вопросов^_^