ASP.NET MVC Login Модальные проблемы - редирект идет в модал? - PullRequest
0 голосов
/ 27 ноября 2010

У меня есть вид входа в систему, который отображается в модальном диалоговом окне (с использованием jquery simplemodal), и когда пользователь не может войти в систему - он работает нормально - ошибка возвращается к модальному. Проблема заключается в том, что когда пользователь успешно входит в систему - предполагается, что страница перенаправлена, и модальное сообщение исчезает, но теперь модальное обновление обновляется на всю страницу :(

Чтобы модал выглядел правильно - я проверяю, чтобы увидеть в AccountController, если источником входа был Ajax, если так - вернуть частичное представление (для отображения в модале), если нет, вернуть полное представление ( в случае, если пользователь пытается получить доступ к странице за пределами сайта)

public ActionResult LogOn()
    {
        if (Request.IsAjaxRequest())
        {
            return PartialView("_LogOn");
        }

        return View();
    }

    [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (MembershipService.ValidateUser(model.UserName, model.Password))
            {
                FormsService.SignIn(model.UserName, model.RememberMe);
                if (!String.IsNullOrEmpty(returnUrl))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }

        // If we got this far, something failed, redisplay form
        if (Request.IsAjaxRequest())
        {
            return PartialView("_LogOn");
        }

        return View();
    }

В моем Logon UserControl (тот, который есть в Site.Master) я добавил скрипт для входа из javascript при нажатии на ссылку входа в систему

<script type="text/javascript">
    function openModel() {   
        $.ajax({
            type: "get",
            url: '/Account/LogOn',
            dataType: "html",
            contentType: "application/x-www-form-urlencoded;charset=utf-8",
            //  async: true,  
            success: function (result) {
                $.modal(result, {
                    closeHTML: "",
                    containerId: "login-container",    
                    overlayClose: true
                });
            }
        });  

    }       
</script>

Хотя частичное представление (возвращаемое при вызове Ajax) выглядит так:

<% using (Ajax.BeginForm("LogOn", "Account", new AjaxOptions{UpdateTargetId = "logonForm"})) { %>
<div id="logonForm">
    <%: Html.ValidationSummary(true, "Login was unsuccessful. Please review and try again.") %>

    <p>Please enter your username and password.
            </p>

        <p>
            <input id="submit" type="submit" value="Log In" />
        </p>
</div>

<%}%>

Так что проблема в том, что AjaxOptions UpdateTargetId - это logonForm - это то, что я хочу, когда пользователь не может войти в систему, но когда успешный вход в систему ... я хочу, чтобы он обновлял страницу в обычном режиме, - но я не могу различить вход в систему ajax и обычный вход в AccountController.LogOn, если я не сделаю это: P

Есть идеи? Надеюсь, что это имеет смысл - спасибо

Это похоже на то, что я облажался в любом случае.

Ответы [ 2 ]

2 голосов
/ 28 ноября 2010

Поэтому вместо того, чтобы всегда возвращать html обратно к успешному обратному вызову javascript, я бы рекомендовал возвращать json везде, где у вас есть return RedirectToAction или return Redirect.

if (Request.IsAjaxRequest())
    return Json(new {Url = returnUrl});
else 
    return Redirect(returnUrl);

Или

if (Request.IsAjaxRequest())
    return Json(new {Url = Url.Action("Index", "Home")});
else 
    return RedirectToAction("Index", "Home");

На стороне javascript сделайте что-то вроде

success: function (result) {
    if(typeof result === 'string'){
        $.modal(result, {
            closeHTML: "",
            containerId: "login-container",    
            overlayClose: true
         });
    }
    else if (result.Url){
        location.href = result.Url;
    }
}
0 голосов
/ 19 мая 2011

Несколько простых jQuery для размещения на страницах, которые должны «вспыхнуть», если они случайно отображаются в диалоговом окне:

<script type="text/javascript">

$(function () {

    if ($('title').length > 1) {
        location = '<%: Request.RawUrl %>';
    }
});

</script>
...