MVC2 AJAX - определение UpdateTargetId на основе возвращенных данных - PullRequest
1 голос
/ 06 января 2011

Сценарий:

Я создаю форму входа для приложения MVC2.

Как я это делаю :

Форма отправляется в действие MVC2, которое проверяет имя пользователя / пароль. Если проверка не пройдена, действие возвращает форму (частичное представление), чтобы пользователь мог повторить попытку. Если он проходит проверку, действие возвращает страницу, которую посетил пользователь до того, как он вошел в систему (представление).

Что я хочу, чтобы произошло:

1 - когда форма отправлена ​​и пользователь успешно подтвердил, возвращаемый результат должен заменить текущую страницу (как, например, если вы не установите UpdateTargetId).

2 - Когда форма отправляется и пользователь не проходит проверку, возвращаемый результат должен заменить форму (как, например, если вы установите UpdateTargetID для элемента, содержащего форму).

Проблема:

Я могу заставить обе эти вещи работать, но не одновременно. Я могу либо сделать так, чтобы он всегда заменял текущую страницу, либо всегда просто заменять содержимое элемента UpdateTargetId. Но мне нужно, чтобы это можно было сделать в зависимости от того, успешно ли пользователь прошел валидацию или нет.

Что мне нужно

Идеальным решением было бы иметь возможность проверить результат запроса ajax и определить, использовать ли UpdateTargetId (заменяя только форму) или нет (заменяя всю страницу). Я ожидаю, что это потребует некоторой работы с jquery (при условии, что это возможно), но я не очень хорош в jquery, чтобы понять, как сделать это самому. Если это невозможно сделать таким образом, я также открыт для других методов / решений, чтобы заставить его работать аналогичным образом.

Заранее спасибо ..

По запросу. Код для акции. Но, как я уже сказал. Это стандартное действие LogOn, которое поставляется по умолчанию с каждым приложением MVC. Единственное отличие состоит в том, что он возвращает частичное представление при сбое проверки.

[HttpPost]
    [MedLife.Code.Compression.CompressFilter]
    public ActionResult SignIn(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
        return PartialView("Overlays/LoginControl", model);
    }

Ответы [ 2 ]

1 голос
/ 06 января 2011

В своем коде на стороне сервера проверьте, работает ли проверка, если нет, верните RedirectToAction в любое нужное вам полное представление.

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

Вы должны сделатьRedirectToAction (т. Е. Не просто возвращать View ("myViewWhenInvalid");), потому что в противном случае представление будет отображаться в UpdateTargetID, который не будет хорошо выглядеть.

EDIT:

Т.е.1009 *

public ActionResult myLoginAction(string name, string pwd)
{
// do the login stuff
if (loggedIn) 
{
return RedirectToAction(...);
}
else
{
return MyJsonAction();
}
}

public MyJsonAction()
{
return some Json...;
}

PS: У меня простуда, поэтому я не хотел проверять свою идею.

1 голос
/ 06 января 2011

Предположим, вы возвращаете результат Json со строкой «INVALID», если логин / пароль неверен. Затем вы используете UpdateTargetId.

Если результат Json! = "INVALID", тогда вы замените контейнер новой частичной страницей.

Вот как я это делаю, и это прекрасно работает. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...