Mam prostą akcję ASP.NET MVC, taką jak ta:
public ActionResult Edit(EditPostViewModel data)
{
}
EditPostViewModel
Mieć atrybuty walidacyjne jak to:
[Display(Name = "...", Description = "...")]
[StringLength(100, MinimumLength = 3, ErrorMessage = "...")]
[Required()]
public string Title { get; set; }
W widoku używam następujących pomocników:
@Html.LabelFor(Model => Model.EditPostViewModel.Title, true)
@Html.TextBoxFor(Model => Model.EditPostViewModel.Title,
new { @class = "tb1", @Style = "width:400px;" })
Jeśli prześlę na formularzu, że to pole tekstowe zostanie umieszczone w formularzu, walidacja zostanie wykonana najpierw na kliencie, a następnie na usłudze ( ModelState.IsValid
).
Teraz mam kilka pytań:
Czy można tego użyć zamiast przesyłania jQuery ajax? Po prostu usuwam formularz, a po kliknięciu przycisku przesyłania javascript zbierze dane, a następnie uruchomi plik
$.ajax
.Czy strona serwera będzie
ModelState.IsValid
działać?Jak mogę przekazać problem z walidacją z powrotem do klienta i przedstawić go tak, jakbym korzystał z funkcji build int validation (
@Html.ValidationSummary(true)
)?
Przykład połączenia Ajax:
function SendPost(actionPath) {
$.ajax({
url: actionPath,
type: 'POST',
dataType: 'json',
data:
{
Text: $('#EditPostViewModel_Text').val(),
Title: $('#EditPostViewModel_Title').val()
},
success: function (data) {
alert('success');
},
error: function () {
alert('error');
}
});
}
Edycja 1:
Zawarte na stronie:
<script src="/Scripts/jquery-1.7.1.min.js"></script>
<script src="/Scripts/jquery.validate.min.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js"></script>
źródło
Odpowiedzi:
Strona klienta
Korzystanie z
jQuery.validate
biblioteki powinno być dość proste w konfiguracji.Określ następujące ustawienia w
Web.config
pliku:Kiedy tworzysz swój pogląd, możesz zdefiniować takie rzeczy:
UWAGA: Należy je zdefiniować w elemencie formularza
Następnie należałoby uwzględnić następujące biblioteki:
Powinno to umożliwić skonfigurowanie sprawdzania poprawności po stronie klienta
Zasoby
Po stronie serwera
UWAGA: Dotyczy to tylko dodatkowego sprawdzania poprawności po stronie serwera nad
jQuery.validation
bibliotekąMoże coś takiego mogłoby pomóc:
Gdzie
ValidateAjax
jest atrybut zdefiniowany jako:To powoduje zwrócenie obiektu JSON określającego wszystkie błędy modelu.
Przykładowa odpowiedź to
To byłby zwrócony do obsługi błędów zwrotnego na
$.ajax
wezwanieMożesz zapętlić zwrócone dane, aby ustawić komunikaty o błędach zgodnie z potrzebami w oparciu o zwrócone klucze (myślę, że coś takiego
$('input[name="' + err.key + '"]')
mogłoby znaleźć Twój element wejściowyźródło
for (var i = 0; i < modelStateErrors.length; i++) { $('span[data-valmsg-for="' + modelStateErrors[i].key + '"]').text(modelStateErrors[i].errors[0]); }
Powinieneś zrobić serializację danych formularza i wysłać je do akcji kontrolera. ASP.NET MVC powiąże dane formularza z
EditPostViewModel
obiektem (parametr metody akcji) przy użyciu funkcji powiązania modelu MVC.Możesz zweryfikować swój formularz po stronie klienta i jeśli wszystko jest w porządku, wyślij dane na serwer. Ta
valid()
metoda się przyda.źródło
Oto dość proste rozwiązanie:
W kontrolerze zwracamy nasze błędy w ten sposób:
Oto część skryptu klienta:
Oto jak sobie z tym radzimy przez Ajax:
Ponadto renderuję częściowe widoki przez Ajax w następujący sposób:
RenderRazorViewToString, metoda:
źródło
PartialView
do renderowania do Ajax?Dodano więcej logiki do rozwiązania dostarczonego przez @Andrew Burgess. Oto pełne rozwiązanie:
Utworzono filtr akcji, aby uzyskać błędy dla żądania Ajax:
Dodano filtr do mojej metody kontrolera jako:
Dodano wspólny skrypt do walidacji jQuery:
Na koniec dodałem metodę javascript błędu do mojego formularza Ajax Begin:
źródło
Możesz to zrobić w ten sposób:
( Edycja: biorąc pod uwagę, że czekasz na odpowiedź
json
zdataType: 'json'
).NETTO
JS:
Jeśli potrzebujesz, mogę również wyjaśnić, jak to zrobić, zwracając błąd 500 i otrzymując błąd w zdarzeniu error (ajax). Ale w twoim przypadku może to być opcja
źródło