2014-12-18 2 views
1

Так у меня есть таблица с моей точки зрения, и с помощью следующего сценария я отправить Аякса данные в контроллер, который обновляет свою базу данных:Почему в моем проекте MVC не возникает ошибка ajax?

$('.save-table').on('click', function() { 
       var tr = $(this).parents('tr:first'); 
       var PredefName = tr.find("#PredefName").val(); 
       var PredefDescription = tr.find("#PredefDescription").val(); 
       var PredefID = tr.find("#PredefID").html(); 
       tr.find("#lblPredefName").text(PredefName); 
       tr.find("#lblPredefDescription").text(PredefDescription); 
       tr.find('.edit-mode, .display-mode').toggle(); 

       $.ajax({ 
        url: '/PredefinedViews/Update/', 
        data: JSON.stringify({ pID: PredefID, pName: PredefName, pDescript: PredefDescription }), 
        type: 'POST', 
        contentType: 'application/json; charset=utf-8', 
        error: function (event, jqxhr, settings, exception) { 
         alert("something went wrong") 
         if (jqxhr.status == 401) { 
          alert("session expired!"); 
         } 
        }, 
        success: function (event, jqxhr, settings, exception) { 
         alert("database updated!"); 
        } 
       }); 
      }); 

Так что у меня сессия, которая должна быть 5mins короткие, которые Я настроен успешно, мне нужно, чтобы пользователь получил уведомление о том, что сеанс истек НО сообщение об ошибке никогда не запускается после окончания сессии! однако ALWAYS запускает сообщение об успешном завершении, даже если ничего не было сохранено в базе данных. Так что мой вопрос в том, как я могу вызвать ошибку ajax?

EDIT1 Вот метод в мой контроллер:

 [HttpPost] 
    [ValidateInput(false)] 
    public ActionResult Update(int pID, string pName, string pDescript) 
    { 
     using (PanSenseEntities context = new PanSenseEntities()) 
     { 
      tblPredefineView existingPredefineView = context.tblPredefineViews.Find(pID); 
      existingPredefineView.Name = pName; 

      existingPredefineView.Description = pDescript; 
      context.SaveChanges(); 
     } 
     return Json(JsonRequestBehavior.AllowGet); 
    } 

EDIT2 Я просто понял, что если истекает сеанс она не достигает даже контроллер! Im stumped здесь сейчас ...

+0

Можете ли вы поделиться своим кодом действия на стороне сервера? –

+0

Вам нужно выбросить исключение или вернуть ошибку Http –

ответ

1

Here аналогичный вопрос

код оттуда, @Darin Димитров предлагают создать пользовательский атрибут авторизовать и обрабатывать несанкционированные запросы:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = new JsonResult 
      { 
       Data = new 
       { 
        // put whatever data you want which will be sent 
        // to the client 
        message = "sorry, but you were logged out" 
       }, 
       JsonRequestBehavior = JsonRequestBehavior.AllowGet 
      }; 
     } 
     else 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
    } 
} 
+0

, которая была, спасибо! – Vrankela

0

Введите код своего сервера try-catch и throw исключение в catch block. Это наверняка вызовет ошибку ajax. Обратите внимание, что обратный вызов ошибки будет выполнен, если ответ с сервера не будет тем, что вы ожидали. Пока есть правильный ответ от сервера, ошибка ajax не будет запущена.

1

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

throw new HttpException(401, "Unauthorized access"); 
+0

так где я должен поместить ваш предложенный код? в ошибке ajax? – Vrankela

+0

В вашем методе действий перед выполнением любых операций с БД, которые отображаются в вашем коде. – Venkat

0

Вы должны проверить сессию, что-то вроде:

[HttpPost] 
[ValidateInput(false)] 
public ActionResult Update(int pID, string pName, string pDescript) 
{ 
    if(!HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     throw new HttpException(401, "Unauthorized access"); 
    } 

    using (PanSenseEntities context = new PanSenseEntities()) 
    { 
     tblPredefineView existingPredefineView = context.tblPredefineViews.Find(pID); 
     existingPredefineView.Name = pName; 

     existingPredefineView.Description = pDescript; 
     context.SaveChanges(); 
    } 
    return Json(JsonRequestBehavior.AllowGet); 
} 

Здесь, я проверяю сессию:

HttpContext.Current.User.Identity.IsAuthenticated 

А потом, блок ошибки в запросе будет выполняется, если HttpContext.Current.User.Identity.IsAuthenticated == false.

+0

Проблема в том, что точка останова даже не попадает на контроллер, если сеанс истек. Он доступен только во время сеанса – Vrankela

Смежные вопросы