2013-03-26 3 views
2

Я пытаюсь включить мою регистрационную форму в файл _Layout.cshtml, но у меня с ней несколько проблем.Включая форму входа в главную страницу макета - ASP.NET MVC 3

Прежде всего, когда я предоставляю неправильное имя пользователя и/или пароль, или поля ввода не проходят проверку, вместо отображения сообщений об ошибках в частичном представлении, это делает частичный просмотр занятым всего экрана !

Это частичный вид: http://i.imgur.com/oisCj85.png?1

Это «частичный» вид возвращается, когда что-то пойдет не так с лесозаготовок в: http://i.imgur.com/Uc5Sh2t.png?1

а во-вторых, когда вход в систему является успешным, пользователь выполняет вход в систему, перезагружает страницу, но Javascript в <body onload="loadPage();> в _Layout.cshtml не выполняет (и как таковой я не могу заставить панель входа снова появляться, потому что она по умолчанию рушилась). EDIT: эта проблема теперь решена, JS не выполнялся, потому что в ней были ошибки. Он ссылается на кнопку, которая показывает только, когда вы не вошли в систему, очевидно, что сломал код, когда вы которые вошли в систему :)

Вот мой код:

_LogOn.cshtml:

@model project_blok_c_groep_13_webshop.Models.LogOnModel 

@{ 
    if (Request.IsAuthenticated) 
    { 
    <div class="minicolumn"> 
     U bent ingelogd als: @User.Identity.Name 
    </div> 
    <div class="minicolumn miniborder"> 
     Click here to log out! 
    </div> 
    } 
    else 
    { 
    <div class="minicolumn"> 
     @using (Html.BeginForm("_LogOn", "Account", new { ReturnUrl = Request.QueryString["ReturlUrl"] })) 
     { 
      <span style="color:red">@Html.ValidationSummary(true, "Incorrecte gebruikersnaam en/of wachtwoord.")</span> 
      <fieldset> 
       Gebruikersnaam: 
       @Html.TextBoxFor(model => model.Username) 
       @Html.ValidationMessageFor(model => model.Username) 

       Wachtwoord: 
       @Html.PasswordFor(model => model.Password) 
       @Html.ValidationMessageFor(model => model.Password) 

       <input type="submit" value="Log-in" /> 
      </fieldset> 
     } 
    </div> 
    } 
} 

_Layout.cshtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<!-- saved from url=(0014)about:internet --> 
<head> 
    <title>Webshop</title> 
    <link href="@Url.Content("~/Content/Site.css")" type="text/css" rel="stylesheet" /> 
    <link href='http://fonts.googleapis.com/css?family=Merriweather+Sans' rel='stylesheet' type='text/css' /> 

    <script type="text/javascript"> 
     <!--lots of javascript omitted here--> 
    </script> 

</head> 

<body onload="loadPage();"> 
    <div class="maindiv"> 
    <div class="topbar"> 
    </div> 
    <div id="minibar"> 
    @Html.ActionLink("Log uit", "LogOff","Account") 
    <a href="/">Home</a> 
    <a href="#">Catalogus</a> 
    <a href="#">Winkelwagen</a> 
    <a href="#">Contact</a> 
    <a onclick="displayBar();">Account</a> 
    <div id="visbar"> 
     @Html.Action("_LogOn", "Account") 
    </div> 
    </div> 
    <div class="content"> 
    <div class="sidebar"> 
     @Html.Action("_Menu", "Home") 
    </div> 


    <div class="center"> 
     <noscript> 
     <p> 
     For full functionality of this site it is necessary to enable JavaScript. 
     Here are the <a href="http://www.enable-javascript.com/" target="_blank"> 
     instructions how to enable JavaScript in your web browser.</a> 
     </p> 
     </noscript> 

     @RenderBody() 

    </div> 
    </div> 
    <div class="footer"> 

    </div> 
    </div> 
</body> 
</html> 

И, наконец, AccountController:

public class AccountController : Controller 
    { 
     private AuthDBController authDBController = new AuthDBController(); 

     public ActionResult LogOff() 
     { 
      FormsAuthentication.SignOut(); 

      return RedirectToAction("Index", "Home"); 
     }  

     /* 
     * Voor de expandable bar. 
     */ 
     public PartialViewResult _LogOn() 
     { 
      return PartialView(); 
     } 

     [HttpPost] 
     public ActionResult _LogOn(LogOnModel logOnModel, string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
       bool auth = authDBController.isAuthorized(logOnModel.Username, logOnModel.Password); 

       if (auth) 
       { 
        FormsAuthentication.SetAuthCookie(logOnModel.Username, false); 
        return Redirect(returnUrl ?? Url.Action("Index", "Home")); 
       } 
       else 
       { 
        ModelState.AddModelError("loginfout", "Incorrecte gebruikersnaam en/of wachtwoord."); 
       } 
      } 
      return PartialView(logOnModel); 
     } 

    } 

Эти проблемы меня озадачили, я просмотрел множество других подобных вопросов, но никто не ответил. Любая помощь будет принята с благодарностью. Наверное, я не понимаю, как работают частичные представления, перенаправления и прочее.

+0

Добро пожаловать в стек. Ваш вход в систему выполняет запись и рассчитывает на дочернее действие, чтобы вернуть Partial и рассматривать его как частичное. Это сложная архитектура. Я бы рекомендовал: a) использовать JQuery Ajax и вызвать JS-обновление при успешном запуске или b) использовать Ajax.BeginForm и обновить ваш контейнер div. –

ответ

3

Я сделал аналогичную функциональность. Действие

Контроллер:

[AllowAnonymous] 
    [HttpPost] 
    public ActionResult LoginJs(LoginModel m, string returnUrl) 
    { 
     if(ModelState.IsValid) 
     { 
      if(ValidateUser(m)) 
      { 
       FormsAuthentication.SetAuthCookie(m.Card, false); 

       return Json(new { success = true, redirect = Url.IsLocalUrl(returnUrl) ? returnUrl : Url.Action("Summary") }); 
      } 

      ModelState.AddModelError("", _invalidUser); 
     } 

     return Json(new { errors = GetErrorsFromModelState() }); 
    } 

    private IEnumerable<string> GetErrorsFromModelState() 
    { 
     return ModelState.SelectMany(x => x.Value.Errors.Select(error => error.ErrorMessage)); 
    } 

Мой _Layout.cshtml код:

@if (Request.IsAuthenticated) 
{ 
    <div class="enter"> 
     U bent ingelogd als: @User.Identity.Name 
     @Html.ActionLink("Log out", "Logoff", "Members", null, new { @class = "exit"  }) 
    </div> 
} 
else 
{ 
    Html.RenderAction("LoginJsGet", "Members"); 
} 

PartialView код:

@model LoginModel 

@using(Html.BeginForm("Login", "Members", FormMethod.Post, new { id = "login", @class = "enter_form" })) 
{ 
    <span style="color:red">@Html.ValidationSummary(true, "Incorrecte gebruikersnaam en/of wachtwoord.")</span> 
      <fieldset> 
       Gebruikersnaam: 
       @Html.TextBoxFor(model => model.Username) 
       @Html.ValidationMessageFor(model => model.Username) 

       Wachtwoord: 
       @Html.PasswordFor(model => model.Password) 
       @Html.ValidationMessageFor(model => model.Password) 

       <input type="submit" value="Log-in" /> 
      </fieldset> 
} 

и JavaScript:

<script> 
$(function() { 
    $('#login').unbind('submit'); 

    $('#login') 
     .attr('action', '/Members/LoginJs') 
     .bind('submit', function() { 
      var form = this; 
      if ($("#login").valid()) { 
       $.post($(form).attr('action'), $(form).serialize(), function (data) { 
        if (data.errors) { 
         makePopup(data.errors, 'error', 'Ошибка входа'); 
        } else { 
         document.location = data.redirect; 
        } 
       }); 
      } 

      return false; 
     }); 
}); 

+0

твердая реализация –

+0

Спасибо за ваши ответы. Можете ли вы объяснить немного больше? Я вообще не знаком с JSon/Ajax и немного потерял, где разместить JScript в частности. Теперь, когда вход в систему прошел успешно, я получаю эту страницу: http://i.imgur.com/FzAqc9K.png?1, и она не перенаправляет меня нигде. Я получаю подобную страницу, когда форма не проходит проверку. – Thorakh

+0

Хорошо, я просто хотел добавить, что это не сработало, потому что я забыл включить библиотеку JQuery в частичное представление _LogOn. Вышеупомянутая реализация (позволяющая некоторым изменениям сделать ее совместимой с моим проектом) отлично работает :) Большое спасибо! – Thorakh