2013-09-04 27 views
9

Ten problem doprowadza mnie do szału już od ponad kilku godzin. Czytałem tak wiele postów i artykułów, że mam niejasne zrozumienie problemu, ale nie przyczyny. Zdaję sobie sprawę, że problem polega na tym, że przesyłam coś takiego jak JSON.parse na obiekt, który jest niezdefiniowany. Nie wiem, dlaczego tak jest. Jestem pewien, że jest to bardzo proste i jestem pewien, że poczuję narzędzie, gdy zostanie to wskazane, ale na razie nie mam nic przeciwko temu, żeby czuć się trochę głupio, jeśli to rozwiąże problem.parseJSON Uncaught SyntaxError: Nieoczekiwany token u

Problem polega na tym, że kiedy przesłać formularz, korzystając z poniższych metod pojawia się następujący błąd:

Uncaught SyntaxError: Unexpected token u js:1 
i.extend.parseJSON js:1 
c js:1 
u js:1 
n.extend.showLabel js:1 
n.extend.defaultShowErrors js:1 
n.extend.showErrors js:1 
n.extend.form js:1 
n.extend.valid js:1 
(anonymous function) 
i.event.dispatch js:1 
y.handle 

Również kiedy przesunąć kursor z pola na pole dostaję ten błąd:

Uncaught SyntaxError: Unexpected token u js:1 
i.extend.parseJSON js:1 
c js:1 
u js:1 
n.extend.showLabel js:1 
n.extend.defaultShowErrors js:1 
n.extend.showErrors js:1 
n.extend.element js:1 
n.extend.defaults.onfocusout js:1 
r js:1 
(anonymous function) js:1 
i.event.dispatch js:1 
y.handle js:1 
i.event.trigger js:1 
i.event.simulate js:1 
f 

To oczywiście uniemożliwia wysłanie formularza do kontrolera, który ma zostać przetworzony. Błąd wydaje się być z biblioteki jquery (linia 498), gdy próbuje: return n.JSON.parse (t); (t jest niezdefiniowane). Używam jquery 1.9.1, bootstrap 2.2.2 i jqValidate/1.9.0.unobtrusive.js. Formularz jest w bootstrap modalnym i wygląda następująco:

@model AModelTestApp.Models.UserModel 

<div class="modal-header"> 
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> 
    <h3>User</h3> 
</div> 

<div class="modal-body"> 

    @{ 
     var ajaxOptions = new AjaxOptions 
      { 
       HttpMethod = "POST", 
       OnComplete = "Complete" 
      }; 
    } 

    @using (Ajax.BeginForm("EditUser", "Home", ajaxOptions, new { id = "userform" })) 
    { 
     <div class="row-fluid"> 
      <div class="span12"> 
       @Html.ValidationSummary("Ooops..", new { id = "validateuser", @class = "alert alert-error" }) 
      </div> 
     </div> 

     <div class="row-fluid"> 
      <div class="span6"> 
       @Html.LabelFor(m => m.Id) 
       @Html.TextBoxFor(m => m.Id) 

       @Html.LabelFor(m => m.Username) 
       @Html.TextBoxFor(m => m.Username) 

       @Html.LabelFor(m => m.FirstName) 
       @Html.TextBoxFor(m => m.FirstName) 

       @Html.LabelFor(m => m.LastName) 
       @Html.TextBoxFor(m => m.LastName) 
      </div> 
      <div class="span6"> 
       @Html.LabelFor(m => m.Email) 
       @Html.TextBoxFor(m => m.Email) 

       @Html.LabelFor(m => m.UserTypeId) 
       @Html.TextBoxFor(m => m.UserTypeId) 

       @Html.LabelFor(m => m.Created) 
       @Html.TextBoxFor(m => m.Created) 

       @Html.LabelFor(m => m.Active) 
       @Html.CheckBoxFor(m => m.Active) 
      </div> 
     </div> 
     <div class="row-fluid"> 
      <div class="span1 offset10"> 
       <a id="btnclear" class="btn" href="#">Clear</a> 
      </div> 
     </div> 
    } 

</div> 

<div class="modal-footer"> 
    <a class="btn" data-dismiss="modal" href="#">Close</a> 
    <a id="btnsubmit" class="btn btn-info" href="#">Submit</a> 
</div> 

<script type="text/javascript"> 
    $.validator.unobtrusive.parse($('#userform')); 

    $('#btnclear').click(function() { 
     $('input').val(''); 
     $(':checkbox').prop('checked', false); 
     return false; 
    }); 

    $('#btnsubmit').click(function() { 

     $('#userform').validate(); 
     if ($('#userform').valid()) { 
      $('#userform').submit(); 
     } else { 
      alert("Something went wrong with the validation") 
     } 

    }); 

    function Complete(result) { 
     alert("Woooo - " + result); 
    } 
</script> 

modalna jest ładowany w sposób następujący:

<div class="row-fluid"> 
    <div class="span12"> 
     <button id="btnclick" class="btn btn-large btn-block btn-primary">Click Me</button> 
    </div> 
</div> 

<div id="mainmodal" class="modal hide fade"></div> 

<script type="text/javascript"> 
    $('#btnclick').click(function() { 
     $.ajax({ 
      url: '@Url.Action("GetUser", "Home")', 
      type: 'GET', 
      success: function (result) { 
       //awss.modal.popup(result); 
       $('#mainmodal').html(result); 
       $('#mainmodal').modal('show'); 
      } 
     }); 
     return; 
    }); 
</script> 

Od tego kontrolera:

public ActionResult GetUser() 
    { 
     var user = new UserModel 
      { 
       Id = 1, 
       Username = "sbody", 
       FirstName = "Some", 
       LastName = "Body", 
       Email = "[email protected]", 
       UserTypeId = 6, 
       Created = new DateTime(2013, 1, 1), 
       Active = true 
      }; 
     return PartialView("EditUser", user); 
    } 

Zarówno ClientValidationEnabled i UnobtrusiveJavaScriptEnabled są włączone w pliku web.config. Mam nadzieję, że to tylko przypadek, gdy patrzę na ten sam problem zbyt długo i nie widzę tego, co oczywiste. Każda pomoc bardzo doceniona. Dzięki :)

+10

dodawania jQuery.przenieś się na swoją listę skryptów, myśl, że powinna ją posortować. – Slicksim

+0

To rzeczywiście zadziałało. Dziękuję Ci. Czy używam tutaj starej techniki, czy też istnieje konflikt, którego nie jestem świadomy? – Tikeb

+3

jquery 1.9+ powoduje problemy z dyskretnymi bibliotekami ajax i walidacyjnymi. pakiet migracji dodaje funkcje, które były dostępne w jQuery 1.8+. – Slicksim

Odpowiedz

1

można wypróbować następujące

'$.parseJSON(result)' 

użytkowania parsejson w swojej funkcji ajax sukcesu.

1

Nie jestem pewien, czy ma to zastosowanie w tym przypadku, czy nie, ale znalazłem sporadyczne problemy, takie jak ten, z dyskretną weryfikacją.

Masz tam element ValidationSummary, więc może to nie mieć zastosowania, ale czas, jaki widziałem, nie zawiera elementu Validation Message.

Minęło trochę czasu, odkąd się o to potknąłem, ale z tego, co pamiętam, musiałem dodać wiadomość dla pozornie niewinnych rzeczy, takich jak pola wyboru. Wygląda na to, że analizowany JSON mógł zawierać element, który miałby zawierać komunikat sprawdzania poprawności, a jeśli byłby to niezdefiniowany, to nie przeszedłby analizy po osiągnięciu tego "u".

Tak więc, na kodzie, może spróbować czegoś takiego:

<div class="row-fluid"> 
    <div class="span6"> 
     @Html.LabelFor(m => m.Id) 
     @Html.TextBoxFor(m => m.Id) 
     @Html.ValidationMessageFor(m => m.Id) 

     @Html.LabelFor(m => m.Username) 
     @Html.TextBoxFor(m => m.Username) 
     @Html.ValidationMessageFor(m => m.Username) 

     @Html.LabelFor(m => m.FirstName) 
     @Html.TextBoxFor(m => m.FirstName) 
     @Html.ValidationMessageFor(m => m.FirstName) 

     @Html.LabelFor(m => m.LastName) 
     @Html.TextBoxFor(m => m.LastName) 
     @Html.ValidationMessageFor(m => m.LastName) 
    </div> 
    <div class="span6"> 
     @Html.LabelFor(m => m.Email) 
     @Html.TextBoxFor(m => m.Email) 
     @Html.ValidationMessageFor(m => m.Email) 

     @Html.LabelFor(m => m.UserTypeId) 
     @Html.TextBoxFor(m => m.UserTypeId) 
     @Html.ValidationMessageFor(m => m.UserTypeId) 

     @Html.LabelFor(m => m.Created) 
     @Html.TextBoxFor(m => m.Created) 
     @Html.ValidationMessageFor(m => m.Created) 

     @Html.LabelFor(m => m.Active) 
     @Html.CheckBoxFor(m => m.Active) 
     @Html.ValidationMessageFor(m => m.Active) 

    </div> 
</div> 
0

Wystarczy dodać następujący kod Kwestia jest się z powodu niedostępności rozpiętości, aby wyświetlić komunikat o błędzie

$('input[name],select[name]').each(function() 
{ 

    if ($(this).attr('name') != '') 
    { 

     if ($(this).closest('div').find('span[data-valmsg-for=' + $(this).attr('name') + ']').length == 0) 
     { 
      $(this).closest('div').append('<span class="field-validation-valid error_msg" data-valmsg-for="' + $(this).attr('name') + '" data-valmsg-replace="true"></span>'); 
     } 
    } 
}) 
Powiązane problemy