Модальные проблемы с входом в ASP.NET MVC - перенаправление переходит в модальное?

У меня есть представление входа в систему, отображаемое в модальном диалоговом окне (с использованием 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

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

Как будто я облажался в любом случае.


person Jerrold    schedule 27.11.2010    source источник


Ответы (2)


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

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

Or

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;
    }
}
person Josiah Ruddell    schedule 27.11.2010

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

<script type="text/javascript">

$(function () {

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

</script>
person James McCormack    schedule 19.05.2011