Exemplo:
Modelo:
public class MyViewModel
{
[Required]
public string Foo { get; set; }
}
Controlador:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return Content("Thanks", "text/html");
}
}
Visão:
@model AppName.Models.MyViewModel
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<div id="result"></div>
@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "result" }))
{
@Html.EditorFor(x => x.Foo)
@Html.ValidationMessageFor(x => x.Foo)
<input type="submit" value="OK" />
}
e aqui está um exemplo melhor (na minha perspectiva):
Visão:
@model AppName.Models.MyViewModel
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/index.js")" type="text/javascript"></script>
<div id="result"></div>
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Foo)
@Html.ValidationMessageFor(x => x.Foo)
<input type="submit" value="OK" />
}
index.js
:
$(function () {
$('form').submit(function () {
if ($(this).valid()) {
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function (result) {
$('#result').html(result);
}
});
}
return false;
});
});
que pode ser aprimorado ainda mais com o plug-in de formulário jQuery .
Eu acho que todas as respostas perderam um ponto crucial:
Se você usar o formulário Ajax para que ele precise se atualizar (e NÃO outra div fora do formulário), será necessário colocar a div contida FORA do formulário. Por exemplo:
Caso contrário, você terminará como @David, onde o resultado será exibido em uma nova página.
fonte
UnobtrusiveJavaScriptEnabled
como verdadeiro em qualquer lugarAcabei conseguindo a solução de Darin, mas cometi alguns erros primeiro, o que resultou em um problema semelhante ao de David (nos comentários abaixo da solução de Darin), onde o resultado estava sendo publicado em uma nova página.
Como tive que fazer algo com o formulário após o retorno do método, guardei-o para uso posterior:
No entanto, essa variável não possui as propriedades "action" ou "method" usadas na chamada ajax.
Em vez disso, você precisa usar a variável "this":
fonte
jQuery
objeto como forma de seleção.form[0]
teria as propriedades. Também é uma boa prática prefixar todas asjQuery
variáveis$
para identificá-las mais facilmente.A solução de Darin Dimitrov funcionou para mim com uma exceção. Quando enviei a exibição parcial com erros de validação (intencionais), acabei retornando formulários duplicados na caixa de diálogo:
Para corrigir isso, tive que quebrar o Html.BeginForm em uma div:
Quando o formulário foi enviado, limpei a div na função success e produzi o formulário validado:
fonte
Partial Views
para renderizar a função de criação abaixo da página de índice. Eu posso receber todas as mensagens de validação na exibição parcial. Mas quando o processoCreate
for bem sucedido, o índice será exibido duas vezes. Não tenhoHtml.BeginForm
na minha Visualização de índice.UpdateTargetId = "myForm"
vez dissoSe nenhuma validação de dados tiver sido excluída ou o conteúdo sempre for retornado em uma nova janela, verifique se essas 3 linhas estão no topo da visualização:
fonte
Exemplo
// No modelo
// No PartailView //PartailView.cshtml
Na exibição Index.cshtml
No controlador
você deve passar ViewName e Model para o método RenderPartialViewToString. ele retornará a visualização com validação aplicada no modelo e anexará o conteúdo na div "targetId" no Index.cshtml. Dessa maneira, capturando RenderHtml de vista parcial, você pode aplicar a validação.
fonte
Os formulários Ajax funcionam de forma assíncrona usando Javascript. Portanto, é necessário carregar os arquivos de script para execução. Mesmo que seja um pequeno comprometimento de desempenho, a execução ocorre sem postback.
Precisamos entender a diferença entre os comportamentos das formas Html e Ajax.
Ajax:
Não redirecionará o formulário, mesmo que você faça um RedirectAction ().
Realizará operações de salvamento, atualização e qualquer modificação de forma assíncrona.
Html:
Irá redirecionar o formulário.
Realizará operações de forma síncrona e assíncrona (com algum código e cuidado extra).
Demonstrou as diferenças com um POC no link abaixo. Ligação
fonte
Antes de adicionar o Ajax.BeginForm. Adicione os scripts abaixo ao seu projeto na ordem mencionada,
Somente esses dois são suficientes para executar a operação do Ajax.
fonte