Asp.net MVC 2 - возвращенный объект Json не обнаружен в JavaScript? - PullRequest
0 голосов
/ 29 ноября 2010

Обновление: я полностью удалил datatype = "html" и надеюсь, что возвращаемое значение всегда будет оценено - но сейчас ничего не происходит.

Я также добавил код, который вызывает функцию openModal. Он находится в пользовательском контроле входа в систему, который содержится в Site.Master. Надеюсь, это прояснит несколько вещей

Похоже, что из контроллера не возвращается объект json обратно в вызывающую программу ajax, что-то где-то потеряно - я никогда не достигаю этой точки останова ... она полностью пропускает

У меня есть простой модал для входа в систему, поэтому я называю LogOn Action следующим образом:

<div id="logonForm">         
     <% using (Ajax.BeginForm("LogOn", "Account", new AjaxOptions{UpdateTargetId = "logonForm"})) { %>
          //my login form
<% } %>
</div>

И Действие выглядит так:

       [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
       //success login
       if (Request.IsAjaxRequest())
           return Json(new { Url = Url.Action("Index", "Home") }, JsonRequestBehavior.AllowGet);
       else
           return RedirectToAction("Index", "Home");                               
    }

В этот момент он возвращает новый объект Json с URL-адресом в пользовательский элемент управления (в Site.Master) к javascript здесь:

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

        }

</script>

<% if (Request.IsAuthenticated) { %>
        Welcome <b><%: Page.User.Identity.Name %></b>!
         <%: Html.ActionLink("Log Out", "LogOff", "Account") %>         
<% } else { %> 
         <a href="javascript:openModel()">Log In</a> 
<% } %>

... но javacript никогда не ловит его .. я не вижу что в "результате", экран выводит "{Url: /}" - просто странное поведение

Что мне не хватает? отладчик; break срабатывает, когда я впервые щелкаю ссылку, но когда я пытаюсь отправить форму, она проходит через контроллер LogOn - пытается вернуть объект json, но никогда не возвращается к javascript

Большое спасибо

Ответы [ 4 ]

0 голосов
/ 29 ноября 2010

Вам нужно перезаписать щелчок для отправки, чтобы вызвать пользовательскую функцию jQuery ajax. Прямо сейчас он будет использовать Microsoft Ajax. Вот почему ваша функция ajax никогда не вызывается.

Сделайте что-то вроде:

$('form').unbind('submit').submit(function(){
    $.ajax({ type:'post', url: '/Account/LogOn', data: $(this).serialize(), 
       success: function(){
           if (result.Url)
               window.location.href = result.Url;
        }
    });
});
0 голосов
/ 29 ноября 2010

dataType: "html", должно быть dataType: "json",, и это должно решить проблему.

0 голосов
/ 29 ноября 2010

Ну, jQuery никогда не вызовет обратный вызов success, поскольку вы указали dataType: "html",, поэтому он будет ждать ответа text/html, но вы отправляете JSON.

Вам необходимо использовать "json" как тип данных.

См .: http://api.jquery.com/jQuery.ajax/

0 голосов
/ 29 ноября 2010

JQuery не будет рассматривать вызов как возвращающий json, потому что вы сказали, что вызов возвращает html. Вам нужно изменить dataType на json.

Тем не менее, неясно, откуда вы ожидаете вызова openModel. Код в том виде, в каком он есть, будет использовать код Microsoft AJAX и вставит возвращенные данные на страницу, поэтому вы видите, как ваш json появляется на странице.

...