Eu tenho uma ação simples do ASP.NET MVC como esta:
public ActionResult Edit(EditPostViewModel data)
{
}
Eles EditPostViewModel
têm atributos de validação como este:
[Display(Name = "...", Description = "...")]
[StringLength(100, MinimumLength = 3, ErrorMessage = "...")]
[Required()]
public string Title { get; set; }
Na visão, estou usando os seguintes ajudantes:
@Html.LabelFor(Model => Model.EditPostViewModel.Title, true)
@Html.TextBoxFor(Model => Model.EditPostViewModel.Title,
new { @class = "tb1", @Style = "width:400px;" })
Se eu fizer um envio em um formulário que esta caixa de texto seja colocada em uma validação será feita primeiro no cliente e depois no serviço ( ModelState.IsValid
).
Agora tenho algumas perguntas:
Isso pode ser usado com jQuery ajax submit em vez disso? O que estou fazendo é simplesmente remover o formulário e ao clicar no botão enviar um javascript irá coletar os dados e executar o
$.ajax
.O lado do servidor
ModelState.IsValid
funcionará?Como posso encaminhar o problema de validação de volta para o cliente e apresentá-lo como se eu estivesse usando o build int validation (
@Html.ValidationSummary(true)
)?
Exemplo de chamada 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');
}
});
}
Editar 1:
Incluído na página:
<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>
fonte
Respostas:
Cliente
Usando o
jQuery.validate
biblioteca deve ser bem simples de configurar.Especifique as seguintes configurações em seu
Web.config
arquivo:Ao construir sua visualização, você definiria coisas assim:
NOTA: Eles precisam ser definidos em um elemento de formulário
Em seguida, você precisaria incluir as seguintes bibliotecas:
Isso deve ser capaz de configurá-lo para validação do lado do cliente
Recursos
Lado do Servidor
NOTA: Isso é apenas para validação adicional do lado do servidor na parte superior da
jQuery.validation
bibliotecaTalvez algo assim possa ajudar:
Onde
ValidateAjax
é um atributo definido como:O que isso faz é retornar um objeto JSON especificando todos os erros do seu modelo.
A resposta de exemplo seria
Isso seria devolvido ao seu retorno de chamada de tratamento de erros da
$.ajax
chamadaVocê pode percorrer os dados retornados para definir as mensagens de erro conforme necessário com base nas Chaves retornadas (eu acho que algo como
$('input[name="' + err.key + '"]')
encontraria seu elemento de entradafonte
for (var i = 0; i < modelStateErrors.length; i++) { $('span[data-valmsg-for="' + modelStateErrors[i].key + '"]').text(modelStateErrors[i].errors[0]); }
O que você deve fazer é serializar os dados do formulário e enviá-los para a ação do controlador. A ASP.NET MVC vinculará os dados do formulário ao
EditPostViewModel
objeto (seu parâmetro de método de ação), usando o recurso de vinculação do modelo MVC.Você pode validar seu formulário no lado do cliente e se estiver tudo bem, enviar os dados para o servidor. O
valid()
método será útil.fonte
Aqui está uma solução bastante simples:
No controlador, retornamos nossos erros como este:
Aqui estão alguns dos scripts do cliente:
É assim que lidamos com isso via ajax:
Além disso, renderizo visualizações parciais por meio de ajax da seguinte maneira:
Método RenderRazorViewToString:
fonte
PartialView
para renderizar para Ajax?Adicionada mais lógica à solução fornecida por @Andrew Burgess. Aqui está a solução completa:
Criado um filtro de ação para obter erros para a solicitação ajax:
Adicionei o filtro ao meu método de controlador como:
Adicionado um script comum para validação jquery:
Por fim, adicionei o método de erro javascript ao meu formulário Ajax Begin:
fonte
Você pode fazer desta forma:
( Editar: Considerando que você está esperando uma resposta
json
comdataType: 'json'
).INTERNET
JS:
Se precisar também posso explicar como fazer retornando um erro 500, e obter o erro no erro do evento (ajax). Mas, no seu caso, pode ser uma opção
fonte