Estou tendo problemas ao tentar fazer com que a validação jquery discreta funcione com uma visão parcial que é carregada dinamicamente por meio de uma chamada AJAX.
Tenho passado dias tentando fazer esse código funcionar sem sorte.
Aqui está a visão:
@model MvcApplication2.Models.test
@using (Html.BeginForm())
{
@Html.ValidationSummary(true);
<div id="res"></div>
<input id="submit" type="submit" value="submit" />
}
A visão parcial:
@model MvcApplication2.Models.test
@Html.TextAreaFor(m => m.MyProperty);
@Html.ValidationMessageFor(m => m.MyProperty);
<script type="text/javascript" >
$.validator.unobtrusive.parse(document);
</script>
O modelo:
public class test
{
[Required(ErrorMessage= "required field")]
public int MyProperty { get; set; }
}
O controlador:
public ActionResult GetView()
{
return PartialView("Test");
}
e, finalmente, o javascript:
$(doument).ready(function () {
$.ajax({
url: '/test/getview',
success: function (res) {
$("#res").html(res);
$.validator.unobtrusive.parse($("#res"));
}
});
$("#submit").click(function () {
if ($("form").valid()) {
alert('valid');
return true;
} else {
alert('not valid');
return false;
}
});
A validação não funciona. Mesmo se eu não preencher nenhuma informação no texbox, o evento submit mostra o alerta ('válido').
No entanto, se em vez de carregar dinamicamente a visualização, eu usar @Html.Partial("test", Model)
para renderizar a visualização parcial na visualização principal (e não faço a chamada AJAX), a validação funciona bem.
Isso provavelmente ocorre porque, se eu carregar o conteúdo dinamicamente, os controles ainda não existem no DOM. Mas eu faço uma chamada $.validator.unobtrusive.parse($("#res"));
que deve ser o suficiente para deixar o validador sobre os controles recém-carregados ...
Alguém pode ajudar?
unobtrusive.parse
função leva um seletor como argumento, não um elemento.Respostas:
Se você tentar analisar um formulário que já foi analisado, ele não será atualizado
O que você pode fazer ao adicionar um elemento dinâmico ao formulário é
Você pode remover a validação do formulário e revalidá-lo assim:
Acesse os
unobtrusiveValidation
dados do formulário usando odata
método jquery :em seguida, acesse a coleção de regras e adicione os novos atributos de elementos (o que é um tanto complicado).
Você também pode verificar este artigo sobre Aplicação de validação jquery discreta a conteúdo dinâmico em ASP.Net MVC para um plugin usado para adicionar elementos dinâmicos a um formulário. Este plugin usa a segunda solução.
fonte
$("form").data("validator").settings
serão removidas$(formSelector).removeData("validator")
e substituídas pelos padrões de$.validator.defaults
quando o formulário foi novamente analisado. Essa é uma ótima maneira de incluir campos dinâmicos, mas certifique-se de repetir qualquer código de inicialização personalizado em cada nova análise.Como complemento à resposta de Nadeem Khedr ....
Se você carregou um formulário no seu DOM dinamicamente e depois chame
(com os bits extras mencionados) e, em seguida, enviaremos esse formulário usando ajax, lembre-se de chamar
que retorna verdadeiro ou falso (e executa a validação real) antes de enviar seu formulário.
fonte
adicione isso ao seu _Layout.cshtml
fonte
Surpreendentemente, quando vi esta pergunta, os documentos oficiais do ASP.NET ainda não tinham nenhuma informação sobre o
parse()
método discreto ou como usá-lo com conteúdo dinâmico. Tomei a liberdade de criar um problema no repositório de documentos (referenciando a resposta original de @Nadeem) e enviar uma solicitação de pull para corrigi-lo. Essas informações agora estão visíveis na seção de validação do lado do cliente do tópico de validação de modelo.fonte
teste isto:
fonte
Eu fui atingido pelo mesmo problema e nada funcionou, exceto este:
e adicione
onde você está tentando salvar o formulário.
Estava salvando o formulário por meio da chamada do Ajax.
Espero que isso ajude alguém.
fonte
apenas copie este código novamente no final do código modal
;)
fonte