2015-06-25 2 views
3

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

Вот что я сделал до сих пор:

Вид:

var RequestCreateAccount_Submit = function() { 

     var res = false; 
     ValidationAttribute.BlankValue(true); 
     var form = $('form#RequestCreateAccount'); 
     $.validator.unobtrusive.parse(form); 
     var res = form.valid(); 
     var data = form.serialize(); 

     if (res) { 
      $.ajax({ 
       url: Url.getFullUrl('Account/RequestCreateAccount_Submit'), 
       type: 'Post', 
       data: data, 
       cache:false, 
       success: function (data) { 
        //Next Dialog 

       }, 
       error: AjaxLog.HandleAjaxCallFail 
      }); 
     } 
     return res; 
    } 

Контроллер:

[AllowAnonymous] 
    [HttpPost] 
    public ActionResult RequestCreateAccount_Submit(UserAccount userAccount)  
    { 
     //Check if username is unique 
     if (!WebSecurity.UserExists(userAccount.UserName)) 
     { 
      UserSession.AddValue(StateName.CreateOrEditAccount, "CurrentUserAccount", userAccount); 
      JsonResult res = Json(new { Success = true, data = "", Message = "" }); 
      return res; 
     } 
     JsonResult jres = Json(new { Success = false, data = "", Message = "Username is already registered"}); 
     return jres; 
    } 

Я тестировал его с известным именем и она попала в успех = ЛОЖЬ (вне строки if), и она не попала внутрь статута if. Поэтому я знаю, что проверка на стороне сервера работает.

Однако, мне интересно, почему на стороне клиента это все еще успех = истина, и появился следующий диалог. Это не подвело к проверке. Что я делаю неправильно на стороне клиента?

+1

Каких проверок мы говорим? – haim770

+0

Вы не показали нам, что в вашем клиентском коде предполагается, чтобы имя пользователя не было принято. Как выглядит этот код? – Becuzz

+0

@Becuzz, у меня нет проверки на стороне клиента для имени пользователя. Я хочу сказать, что проверка проверки на стороне сервера работает, но в коде на стороне клиента следующий диалог все еще отображается. –

ответ

2

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

Вы должны проверить статус ответа внутри вашего успеха функции обратного вызова

dotNetFiddle Demo

$.ajax({ 
    url: Url.getFullUrl('Account/RequestCreateAccount_Submit'), 
    type: 'Post', 
    data: data, 
    cache:false, 
    success: function (data) { 
    if(data.Success === false){ 
     AjaxLog.HandleAjaxCallFail(); 
     // this may not make as much sense though 
     // as the request didn't actually fail, just the action did 
     //TODO: code for name fail 
     return;//do not process next dialog 
    } 
    //Next Dialog 

    }, 
    error: AjaxLog.HandleAjaxCallFail 
    }); 
+0

hmm okay, я попробую попробовать, но мне любопытно об одном: проверяет ли мои данные формы на стороне клиента, мешая проверке проверки на стороне сервера для имени пользователя? Без прав? Является ли способ, которым я его настроил выше, хорошо? Благодарю. –

+0

Нет, это не повлияет на серверную сторону. Он просто анализирует элементы формы, которые правильно устанавливают типы данных проверки, и проверяет, действительны ли они в соответствии с требованиями проверки для каждого элемента. Затем он сериализует их для представления, чтобы модельное связующее могло принимать данные. Ничто из этого не повлияет на проверку на стороне сервера. –

+0

Он по-прежнему перешел к следующему диалогу: OI следовал за вашим подходом: if (data.success == «False») {return;} // next –

1

success = false вашего объекта результата не означает, что запрос не удалось. Он стоит только для data.success, не более того. По-прежнему остается (HTTP 200), который я считаю правильным кодом ответа. Если вы вернете код ошибки, например new HttpStatusCodeResult(404, "error message");, это означает, что ваш запрос не удался, но это неверно.

Вы запрашиваете работу независимо от результата проверки. Таким образом, вы можете проверить это в вашем success обратного вызова, вместо error обратного вызова:

success: function(data) { 
    if (data.success) { 
     //Next Dialog 
    } 
    else { 
     // error message 
    } 
} 
+0

Это не работает так, как написано. Имейте в виду, что когда сервер возвращает логическое значение, он преобразуется в строчную форму. Таким образом, логическое значение true в C# на самом деле является «True» в ответе, а false - False ". If (" False ") в JavaScript истинно. –

+0

@TravisJ Я знаю, это был только пример, иначе я бы ввел весь код, как вы. Возможно, если был определен' dataType: "json" ', может работать. – DontVoteMeDown

+0

@TravisJ [** dataType **: * "json": оценивает onse как JSON и возвращает объект JavaScript *] (http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings) – DontVoteMeDown

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