ユーザーが自分のアプリケーションにログインできるログインフォームが1つあります。ログインに失敗した場合は、エラーメッセージをクライアントに表示します。
このために私のコントローラーはこの2つの機能を持っています:-
[NopHttpsRequirement(SslRequirement.Yes)]
public ActionResult Login(bool? checkoutAsGuest)
{
if (_workContext.CurrentCustomer.IsRegistered())
{
if (Request.QueryString["returnUrl"]!=null)
{
return Redirect(Convert.ToString(Request.QueryString["returnUrl"]));
}
}
var model = new LoginModel();
model.UsernamesEnabled = _customerSettings.UsernamesEnabled;
model.CheckoutAsGuest = checkoutAsGuest.HasValue ? checkoutAsGuest.Value : false;
model.DisplayCaptcha = _captchaSettings.Enabled && _captchaSettings.ShowOnLoginPage;
return View(model);
}
[HttpPost]
[CaptchaValidator]
public ActionResult Login(LoginModel model, string returnUrl, bool captchaValid)
{
//validate CAPTCHA
if (_captchaSettings.Enabled && _captchaSettings.ShowOnLoginPage && !captchaValid)
{
ModelState.AddModelError("", _localizationService.GetResource("Common.WrongCaptcha"));
}
if (ModelState.IsValid)
{
if (_customerSettings.UsernamesEnabled && model.Username != null)
{
model.Username = model.Username.Trim();
}
bool Active = true;
if (_customerRegistrationService.ValidateCustomer(_customerSettings.UsernamesEnabled ? model.Username : model.Email, model.Password, out Active))
{
var customer = _customerSettings.UsernamesEnabled ? _customerService.GetCustomerByUsername(model.Username) : _customerService.GetCustomerByEmail(model.Email);
//migrate shopping cart
_shoppingCartService.MigrateShoppingCart(_workContext.CurrentCustomer, customer);
//sign in new customer
_authenticationService.SignIn(customer, model.RememberMe);
if (!String.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
{
if (Request.QueryString["returnUrl"].ToString().Contains("search?q"))
{
string url = returnUrl;
if (Request.QueryString["select"] != null)
url = url + "&select=" + Request.QueryString["select"].ToString();
if (Request.QueryString["startdate"] != null)
url = url + "&startdate=" + Request.QueryString["startdate"].ToString();
if (Request.QueryString["enddate"] != null)
url = url + "&enddate=" + Request.QueryString["enddate"].ToString();
if (Request.QueryString["s_loc"] != null)
url = url + "&s_loc=" + Request.QueryString["s_loc"].ToString();
return Redirect(url);
// return Redirect(returnUrl + "&select=" + Request.QueryString["select"] == null ? "" : Request.QueryString["select"].ToString() + "&startdate=" + Request.QueryString["startdate"] == null ? "" : Request.QueryString["startdate"].ToString() + "&enddate=" + Request.QueryString["enddate"] == null ? "" : Request.QueryString["enddate"].ToString() + "&s_loc=" + Request.QueryString["s_loc"] == null ? "" : Request.QueryString["s_loc"].ToString());
}
return Redirect(returnUrl);
}
else
return RedirectToRoute("HomePage");
}
else
{
if (!Active)
ModelState.AddModelError("", _localizationService.GetResource("Account.Login.AccountNotactive"));
else
ModelState.AddModelError("", _localizationService.GetResource("Account.Login.WrongCredentials"));
}
}
//If we got this far, something failed, redisplay form
model.UsernamesEnabled = _customerSettings.UsernamesEnabled;
model.DisplayCaptcha = _captchaSettings.Enabled && _captchaSettings.ShowOnLoginPage;
return View(model);
}
ユーザーが間違ったログインの詳細を入力すると、モデルの状態にエラーが追加され、適切なmsgを使用してビューが顧客に再度表示されます。
しかし、私の問題は、モデルの状態が有効でない場合にコードをレンダリングせずに、ブラウザーにhtmlコードを表示することです。
なぜこれらが発生するのか、私はそれに対する解決策を見つけることができません。