2017-10-25 8 views
-2

私は、ASP.NET MVC Core 1.1.2を使用して電子商取引Webサイトを構築しました。私はASP.NET認証を実装するための正しい方法を使用しましたが、時には顧客がサインインフォームでエラーを取得することがあります(時間の70%)。私はフォームに記入する方法を見ており、ModelStatesは有効です。提供している情報には問題はありません(またはモデルステートには関連していませんが、存在しません)。私はこのエラーが発生するコードの部分を提供します。エラーが発生すると、ページは404ステートメントにリダイレクトされ、elseステートメントに設定されています。助けを前にありがとう。ASP.NET MVC Core 1.1.2サインインフォーム検証エラー

サインアップフォームは次のようになります。

if (ModelState.IsValid && model.Agreed == "on") 
{ 
    User user = new User { UserName = model.Username, Email = model.Email, RoleSpecific = RoleSpecific.Client }; 
    IdentityResult result = await _userManager.CreateAsync(user, model.Password); 
    if (result.Succeeded) 
    { 
     await _userManager.AddToRoleAsync(user, "Client"); 
     Client cli = new Client 
     { 
      UserID = user.Id, 
      HeardOf = model.HeardOf, 
      InstagramUsername = model.Instagram, 
      TelephoneNumber = model.Telephone, 
      TwitterUsername = model.Twitter, 
      University = model.University, 
      Surname = model.FullName.Split(' ').Last(), 
      Name = model.FullName.Substring(0, model.FullName.LastIndexOf(' ')), 
      Gender = (Gender)Enum.ToObject(typeof(Gender), Convert.ToInt32(model.Gender)) 
     }; 
     await _context.AddAsync(cli); 
     _context.SaveChanges(); 
     var id = _context.Clients.Last().ID; 
     var cart = new Cart 
     { 
      ClientID = id 
     }; 
     await _context.AddAsync(cart); 
     _context.SaveChanges(); 

     string confirmationToken = _userManager.GenerateEmailConfirmationTokenAsync(user).Result; 

     string confirmationLink = Url.Action("ConfirmEmail", "Account", new { userid = user.Id, token = confirmationToken }, protocol: HttpContext.Request.Scheme); 
     var message = new MimeMessage(); 
     message.From.Add(new MailboxAddress("[email protected]")); 
     message.To.Add(new MailboxAddress(user.Email)); 
     message.Subject = "Üyelik Onayı"; 
     message.Body = new TextPart("html") 
     { 
      Text = "Sayın " + model.FullName + ",<br/> Kaydınızın Tamamlanması için aşağıdaki linke tıklamanız gerekmektedir.<br/><a href=\"" + confirmationLink + "\">Onaylama Linki</a>" 
     }; 
     using (var client = new SmtpClient()) 
     { 
      client.Connect("smtp.yandex.com", 465); 
      client.Authenticate("[email protected]", "blapenplefe"); 
      client.Send(message); 
      client.Disconnect(false); 
     } 


     return RedirectToAction("Index", "Home"); 
    } 
    else 
    { 
     foreach (var error in result.Errors) 
     { 
      ModelState.AddModelError(string.Empty, error.Description); 
     } 
    } 
} 
return RedirectToAction("Err404", "Home"); 
} 

RegisterViewModel.cs:

namespace UnifrogBasicDeneme.ViewModels 
{ 
    public class RegisterViewModel 
    { 
     [Required] 
     public string Username { get; set; } 

     [Required] 
     [EmailAddress] 
     public string Email { get; set; } 

     [Required] 
     [DataType(DataType.Password)] 
     public string Password { get; set; } 

     [Required] 
     [DataType(DataType.Password)] 
     [Display(Name = "Confirm Password")] 
     [Compare("Password",ErrorMessage ="Yukaridaki sifre ile ayni degil")] 
     public string ConfirmPassword { get; set; } 

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

     public string Gender { get; set; } 

     public string Twitter { get; set; } 

     public string Instagram { get; set; } 

     public string University { get; set; } 

     public string HeardOf { get; set; } 
     [Required] 
     [RegularExpression("^[0-9]+$")] 
     public string Telephone { get; set; } 

     public string Agreed { get; set; } 
    } 
私はエントリがエラーである場合、エラーページにリダイレクト Sign-up form

AccountController.cs

登録フォーム:

<form id="signupForm" method="Post" action="Account/Register"> 
    <div class="form-group-lg"> 
     <input type="text" name="UserName" class="form-control bg-ash" id="exampleInputEmail1" placeholder="Kullanıcı Adı"> 
    </div> 
    <div class="form-group-lg"> 
     <input type="email" name="Email" class="form-control bg-ash" id="exampleInputPassword1" placeholder="Email"> 
    </div> 
    <div class="form-group-lg"> 
     <input type="password" name="Password" class="form-control bg-ash" id="exampleInputPassword1" placeholder="Şifre"> 
    </div> 
    <div class="form-group-lg"> 
     <input type="password" name="ConfirmPassword" class="form-control bg-ash" id="exampleInputPassword1" placeholder="Şifre Tekrar"> 
    </div> 

    <br /> 
    <p>Kullanıcı Bilgileri</p> 

    <div class="form-group-lg"> 
     <input type="text" name="FullName" class="form-control bg-ash" id="exampleInputEmail1" placeholder="Adınız Soyadınız"> 
    </div> 
    <div class="form-group-lg"> 
     <select class="form-control bg-ash" id="exampleInputEmail1" placeholder="Cinsiyet"> 
      <option value="1">Kadın</option> 
      <option value="0">Erkek</option> 
      <option value="2">Diğer</option> 
     </select> 
    </div> 
    <div class="form-group-lg"> 
     <input type="text" name="Twitter" class="form-control bg-ash" id="exampleInputEmail1" placeholder="Twitter"> 
    </div> 
    <div class="form-group-lg"> 
     <input type="text" name="Instagram" class="form-control bg-ash" id="exampleInputEmail1" placeholder="Instagram"> 
    </div> 
    <div class="form-group-lg"> 
     <input type="text" name="University" class="form-control bg-ash" id="exampleInputEmail1" placeholder="Üniversite"> 
    </div> 
    <div class="form-group-lg"> 
     <input type="text" name="HeardOf" class="form-control bg-ash" id="exampleInputEmail1" placeholder="Kimden Duydunuz"> 
    </div> 
    <div class="form-group-lg"> 
     <input type="text" name="Telephone" class="form-control bg-ash" id="exampleInputEmail1" placeholder="Cep Telefonunuz"> 
    </div> 
    <div class="checkbox"> 
     <label> 
      <input type="checkbox" name="Agreed"> <a href="~/img/logo/unifrog.png">Unifrog Şartlarını Okudum Kabul Ediyorum</a> 
     </label> 
    </div> 
    <h5>Giriş yapabilmek için emailinize gelen doğrulama linkine tıklamanız gerekmektedir.</h5> 
    <button type="submit" class="btn btn-default">Kaydol</button> 
</form> 
+0

最も明白なことのようにmodel.Agreedはつまり、彼らはおそらく用語を同意チェックボックスをクリックしていない、に等しくないということであるべきか?あなたが行っていない場合、あなたのエラーページはリダイレクトされます。モデルはモデルを要求しません.Agreedは値を返します。したがって、ティックボックスをクリックしてもモデルステートの無効化は発生しません。フォームには、ユーザーがチェックボックスにチェックを入れるようにするクライアントサイドコードは含まれていません。あなたのコントローラはチェックボックスにチェックが入っている必要があります。したがって、それはチェックされていないときにエラーページにリダイレクトされます。 – Rob

+0

私は知っているが、同意することに関連する問題ではない。私は多くの方法を試みたが、それは私が条件に同意するときに私にエラーを与える。 –

+0

次に、コントローラーにブレークポイントを設定し、フォームをローカルに送信して、F10を使用してアクションを繰り返して問題の原因となっているコード行を確認する必要があります。また、ユーザーがフォーム上で行うことができるエラーごとにフォームのページにエラーサマリーなどが表示され、モデルステートが有効でないときにエラーページではなくユーザーのエラーが返されます。エラーページは3つの問題によってのみ生成され、モデル状態が無効であるか、model.Agreedが選択されていないか、usermanagerがアカウント 'result.succeeded'を作成できませんでした。 – Rob

答えて

0

モデルとモーダルのエラーのビューを返す必要があります。だからあなたの関数の最後は

return View("register",model); 

代わりの

return RedirectToAction("Err404", "Home"); 
+0

あなたは正しいですが、彼はモデルと共にビューをページに戻す必要がありますが、フォームにはエラーを表示するための何も表示されていないので、これは彼を助けません。さらに、モデルステートは彼の質問では有効であると述べました。つまり、エラーはサーバー側の検証ではなく、たとえフォームにエラーを表示するコードがあったとしても、エラーはありません。 – Rob

+0

あなたはそれについて正しいです。私もそれらに気づいたが、主な問題はリダイレクト部分だった。彼はフォームに欠落している検証部品も修正する必要があります。ありがとう。 – Ekrem