Перенаправить в случае успеха и показать ошибку при ошибке - PullRequest
10 голосов
/ 20 декабря 2010

Я реализовал контроллер для создания новых пользователей.Когда он успешно создает пользователя, он перенаправляет на Index().

Я хочу перенаправить , когда все в порядке, но остаться на текущей странице и увидеть ошибку при сбое.

Я использую jQuery ajax с MVC.

Мой контроллер выглядит следующим образом:

[Authorize]
public ActionResult CreateUser(string username)
{
    try
    {
        //here the logic to create the user
    }   
    catch (Exception ex)
    {
        string error = string.Format("Error creating user: {0}", ex.Message);
        Response.StatusCode = 500;
        Response.Write(error);    
    }
    return RedirectToAction("Index");
}

Отправка формы перехватывается с помощью jQuery, а затем выполняется вызов с помощью ajax:

$("#new-user-form").submit(function() {
    var form = $(this);
    $.ajax({
    type: "GET",
        url: form.attr('action'),
        data: form.serialize(),
        success: function(data, textStatus, xhr) {
            //At this point I would like to redirect
        },
        error: function(xhr, textStatus, errorThrown) {
            $(".error-summary").html(xhr.responseText);
        }
    });

    //cancel the event
    return false;
});

Работает нормальнокогда происходит ошибка, но я не знаю, как реализовать случай успеха.

Я открыт для других альтернатив.

Ответы [ 4 ]

29 голосов
/ 20 декабря 2010

Если вы собираетесь перенаправить в успешном действии, почему вы используете AJAX? Цель AJAX - обновить только части сайта без перезагрузки всей страницы. Если в успешном действии вы собираетесь перенаправить, что полностью разрушает все цели и выгоды, которые вы получаете от AJAX. Но поскольку вы спросили, вот что вы можете сделать:

[Authorize]
public ActionResult CreateUser(string username)
{
    ...
    if (Request.IsAjaxRequest())
    {
        return Json(new { redirectToUrl = Url.Action("Index") });
    }
    return RedirectToAction("Index");
}

А потом:

success: function(data, textStatus, xhr) {
    window.location.href = data.redirectToUrl;
},
2 голосов
/ 08 сентября 2016

Если вы собираетесь перенаправить в успешном действии, почему вы используете AJAX?Цель AJAX - обновить только части сайта без перезагрузки всей страницы.Если в этом случае какая-либо ошибка или сеанс истекает, вы собираетесь перенаправить страницу входа по умолчанию. Для этого вам необходимо переопределить фильтр AuthorizeAttribute, чтобы сделать класс belew:

public class CheckAuthorization : AuthorizeAttribute
{

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (HttpContext.Current.Session["AFSUserId"] == null || !HttpContext.Current.Request.IsAuthenticated)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.HttpContext.Response.StatusCode = 302; //Found Redirection to another page. Here- login page. Check Layout ajaxError() script.
                filterContext.HttpContext.Response.End();
            }
            else
            {
                filterContext.Result = new RedirectResult(System.Web.Security.FormsAuthentication.LoginUrl + "?ReturnUrl=" +
                filterContext.HttpContext.Server.UrlEncode(filterContext.HttpContext.Request.RawUrl));
         }
     }
}

После создания этого класса CheckAuthorization, который вы только что поместили, когда выВызовите авторизацию ajax, как показано ниже:

[CheckAuthorization]
public class BuyerController : Controller
{
    [HttpGet()]
    public ActionResult GetOrderlist()
    {
        return View();
    }
}

теперь вам нужно обрабатывать состояние ajax 302 со стороны просмотра для каждого вызова Ajax, поэтому поместите строку кода в порядок страниц макета, указав идентификатор любой конкретной страницы, как показано ниже:

    $(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
        if (jqXHR.status == 302) {
            window.location.href = '@Url.Action("Login", "Home")';
        }
    });

Здесь вы будете перенаправлены на страницу входа в систему по истечении текущего сеанса или по истечении времени ожидания.

1 голос
/ 09 февраля 2012

Вот альтернативный ответ, который использует чистые классы MVC, и вам не нужно жестко кодировать какой-либо скрипт или использовать jQuery.Во-первых, я обнаружил, что валидаторы MVC 2 работают нормально, успешно, неудачно и подтверждают случаи, если вы помните:

1) Включите необходимые скрипты MVC (всего три плюс вызов EnableClientSideValidation - см. MSDN).

2) Поместите MetadataClassAttribute и RequiredAttribtues в ваши объекты модели / данных.Вам не нужно создавать отдельные классы метаданных и делать вашу модель частичной (я считаю, что брюки) просто ссылаются на тот же класс модели в атрибуте.

3) Решите проблему перенаправления AJAX, возвращая JavaScript, как уже предлагалось(но в jQuery-ориентированном виде) ...

Я испытывал странное поведение только во время проверки, когда ему уже не удавалось перенаправить страницу списка на страницу сведений / редактирования.Сообщения об ошибках появляются на несколько секунд, а затем исчезают!Конечно, это было смущено, потому что оболочкой страницы была первая страница списка и внутреннее содержимое страницы редактирования.Таким образом, основной причиной проблемы был готовый инструментарий MVC 2, который не смог правильно перенаправить с первой страницы, а не то, что валидаторы не работали должным образом на второй странице.

Я нашел то же решениездесь:

http://craftycodeblog.com/2010/05/15/asp-net-mvc-ajax-redirect/ ... который я расширил до метода и класса расширения в VB.NET:

    ''' <summary>
    ''' MVC extension methods.
    ''' </summary>
    Public Module MvcExtensions

        ''' <summary>
        ''' Returns an <see cref="AjaxAwareRedirectResult"/> for the specified action
        ''' and optional controller name.
        ''' </summary>
        <Extension()> _
        Public Function AjaxAwareRedirectToAction(controller As Controller, _
                                         actionName As String, _
                                         Optional controllerName As String = Nothing) _
                                     As RedirectResult

            ' Get target URL
            Dim url = controller.Url.Action(actionName, controllerName)

            ' Return AJAX aware redirect result
            Return New AjaxAwareRedirectResult(url)

        End Function

   End Module

    ''' <summary>
    ''' <see cref="RedirectResult"/> which works with MVC 2 AJAX.
    ''' </summary>
    ''' <remarks>
    ''' Normal redirects do not work with AJAX partial updates in MVC (HTTP 302 status).
    ''' With MVC 2 AJAX it is necessary to return JavaScript to change the browser location.
    ''' </remarks>
    Public Class AjaxAwareRedirectResult
        Inherits RedirectResult

        ''' <summary>
        ''' Creates an instance which redirects to the specified URL using
        ''' a response containing either AJAX JavaScript or classic HTTPS 302 status.
        ''' </summary>
        ''' <param name="url">Target URL.</param>
        Sub New(url As String)
            MyBase.New(url)
        End Sub

        ''' <summary>
        ''' Generates the response.
        ''' </summary>
        Public Overrides Sub ExecuteResult(ByVal context As ControllerContext)

            ' Check if AJAX was used for request
            If context.RequestContext.HttpContext.Request.IsAjaxRequest Then

                ' Perform JavaScript redirect when AJAX is used
                Dim destinationUrl As String = UrlHelper.GenerateContentUrl(Url, context.HttpContext)
                Dim result As JavaScriptResult = New JavaScriptResult With {
                        .Script = ("window.location='" + destinationUrl + "';")}
                result.ExecuteResult(context)

            Else

                ' Perform classic HTTP 302 status redirect
                MyBase.ExecuteResult(context)

            End If

        End Sub

    End Class

Итак, у вас есть два варианта.Вы можете следовать типичному шаблону MVC вызова AjaxAwareRedirectToAction (aciton, [controller]) для целей MVC или возвращать новый экземпляр AjaxAwareRedirectResult (url), когда вы имеете в виду конкретную цель URL (т.е. внешний сайт).

Я был очень удивлен, что Microsoft не отсортировала перенаправления AJAX в первом MVC 2 RTM.Я должен использовать MVC 2 в моем текущем проекте, поэтому я должен перенести это ограничение, но у меня также есть несколько более новых решений MVC, которые, как я вижу, больше склоняются к jQuery для проверки.Скоро узнаю, исправят ли они.

0 голосов
/ 20 декабря 2010
 window.location.href="url here"

Moz Doc

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