2013-01-03 5 views
16

Nie mogłem uzyskać funkcji sprawdzania poprawności strony klienta z następującym częściowym widokiem. Ten widok jest w div divetettings div w widoku nadrzędnym. Próbowałem wiele rzeczy od stackoverflow i innych stron, nic nie wydaje się działać. Jakieś pomysły?Sprawdzanie poprawności strony jQuery klienta nie działa w częściowym widoku MVC3

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script> 


@using (Ajax.BeginForm("CreateT", "TAdmin", null, 
     new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "divTSettings"}, 
         new { id = "CreateTForm" })) 
{ 
    <div> 
     <label>Name:</label> 
     <input type="text" name="tName" id="tName"/> 
     @Html.ValidationMessage("tName") 
     <input type="submit" value="Submit"/> 
    </div> 
} 

<script type="text/javascript"> 
$(function() { 
    $('#CreateTForm').validate({ 
     rules: { 
      tName: { 
       required: true 
      } 
     }, 
     messages: { 
      tName: { 
       required: 'Name required' 
      } 
     } 
    }); 
    $("#CreateTForm").removeData("validator"); 
    $("#CreateTForm").removeData("unobtrusiveValidation"); 
    $.validator.unobtrusive.parse("#CreateTForm"); 
}); 
</script> 

Odpowiedz

77

Jakieś pomysły?

Tak, pierwszą rzeczą, którą należy zrobić, to pozbyć się wszystkich tagów <script> z widoku częściowego. Częściowe widoki nie powinny zawierać żadnych skryptów. Częściowe widoki powinny zawierać tylko znaczniki. Powtarzałem to wiele razy i wciąż widzę, jak ludzie umieszczają tam skrypty. Skrypty powinny być zarejestrowane albo w twoim układzie, albo w głównym widoku, w którym renderowałeś częściowe, prawdopodobnie poprzez przesłonięcie niektórych sekcji skryptów zarejestrowanych w twoim układzie, aby wszystkie skrypty zostały wstawione na końcu dokumentu HTML, tuż przed zamykającym tagiem </body> . Tam właśnie należą.

OK, teraz problem polega na tym, że dyskretna walidacja nie działa od razu po dodaniu dynamicznie dodawanych elementów do DOM - na przykład wysłanie żądania AJAX do serwera, który zwraca częściowy widok i ten częściowy widok jest następnie wprowadzany do DOM.

Aby to działało, musisz zarejestrować nowo dodane elementy z dyskretną strukturą sprawdzania poprawności. Aby to zrobić, trzeba zadzwonić do $.validator.unobtrusive.parse na nowo dodanych elementów:

$("form").removeData("validator"); 
$("form").removeData("unobtrusiveValidation"); 
$.validator.unobtrusive.parse("form"); 

Należy umieścić ten kod wewnątrz sukcesu obsługi AJAX, który jest wstrzykiwanie częściowy do swojej DOM. Po wstrzyknięciu nowych elementów po prostu wywołaj tę funkcję.

Jeśli nie piszesz ręcznie żądań AJAX za pomocą jQuery ($ .ajax, $ .post, ...), ale polegasz na tym, że niektórzy pomocnicy Ajax.BeginForm i Ajax.ActionLink wykonują zadanie za Ciebie, trzeba subskrybować wywołania zwrotne OnSuccess w AjaxOptions i umieścić tam ten kod.

+0

Dziękuję za odpowiedź, ale widok częściowy nie jest ładowany przez AJAX, jest ładowany przez obiekt nadrzędny za pomocą modelu nadrzędnego. Tworzy post AJAX, ale sprawdzanie poprawności nie działa nawet przy pierwszym ładowaniu. I jak widzisz, mam inicjacje sprawdzania poprawności wspomniane w procedurze ładowania dokumentu. – blue

+1

Och, nie musisz wykonywać tych inicjalizacji na document.load. Wszystko, co musisz zrobić, to dołączyć do swojej strony skrypty jquery, jquery.validation i jquery.validation.unobtrusive. Również zgodnie z kodem, który pokazałeś, wydajesz się, że subskrybujesz obsługę ".validate" formularza i deklarujesz jakąś niestandardową walidację. Ale nie jest tak, jak działa sprawdzanie poprawności ASP.NET MVC i jquery. Naprawdę musisz wybierać między używaniem adnotacji danych w swoim modelu widoku (takich jak atrybut "[Wymagany]") lub całkowicie definiującym niestandardowe reguły sprawdzania poprawności strony klienta. –

+0

Jeśli zdecydujesz się zapisać własne reguły sprawdzania poprawności (subskrybuj metodę ".validate" formularza), powinieneś usunąć ze strony skrypt "jquery.unobtrusive.validation.js". Te 2 rzeczy są całkowicie niezgodne. Decyzja należy do Ciebie: możesz użyć wbudowanego środowiska ASP.NET MVC (i używać atrybutów sprawdzania poprawności, takich jak "[Wymagany]" w modelu widoku) lub niezależnie używać wtyczki jquery.validate i pisać Twoje niestandardowe reguły. Ale nigdy nie mieszaj tych dwóch, ponieważ są niezgodne. –

0

Jeśli chcesz naprawić na poziomie globalnym, powinno to pomóc. Użyłem w _layout.cstml.

$(document).ajaxStart(function() { 
       $.ajaxSetup({ 
        converters: { 
         "text html": function (textValue) { 
          if (textValue) { 
           // Some parsing logic here 
           var script = "<script type='text/javascript' language='javascript' > $.validator.unobtrusive.parse(\"form\");"; 
           var scriptend = "\<\/script>"; 
           return script + scriptend + " " + textValue; 
          } else { 
           // This will notify a parsererror for current request 
           throw exceptionObject; 
          } 
         } 
        } 
       }); 
      });