CONTROLLER EDIT EXECUTANDO 2 VEZES
Tenho uma solution com 2 projetos(API e MVC) na minha view EDIT está sendo executada 2 vezes, nela faço uma chamada ajax, e debugando percebi que após o click ele executa o metodo e logo em seguida executa novamente não sei o motivo vou enviar meu controller e minha chamada ajax
Meu Controller
[HttpPost]
public async Task<ActionResult> Edit(int id ,DEPARTAMENTO departamento)
{
try
{
var client = new ClientApi();
string cliid = Session[[Ô]usuarioLogadoID[Ô]].ToString();
var json = [Ô]{[ô]dep_nome[ô]:[ô][Ô] + departamento.dep_nome + [Ô][ô],[ô]dep_codigo[ô]:[ô][Ô] + departamento.dep_codigo + [Ô][ô],[ô]cli_id[ô]:[ô][Ô] + cliid + [Ô][ô]}[Ô];
var response = await client.PutRequest([Ô]Departamento/[Ô] + id,json);
if (response.IsSuccessStatusCode)
{
TempData[[Ô]Sucesso[Ô]] = [Ô]Departamento alterado com sucesso[Ô];
return RedirectToAction([Ô]Index[Ô],[Ô]Departamento[Ô]);
}
if (response.StatusCode == HttpStatusCode.NotFound)
{
TempData[[Ô]Alerta[Ô]] = [Ô]Código do departamento não encontrado[Ô];
return RedirectToAction([Ô]Edit[Ô]);
}
}
catch(Exception ex)
{
TempData[[Ô]Perigo[Ô]] = ex.Message;
}
return View();
}
Meu Ajax
$(function () {
$([Ô]#btnAlterar[Ô]).click(function () {
//token para o ValidateAntiForgeryToken
var token = $([ô][name=__RequestVerificationToken][ô]).val();
var headers = {};
headers[[ô]__RequestVerificationToken[ô]] = token;
//Pegando o valor da session
var cliente = parseInt(@HttpContext.Current.Session[[Ô]usuarioLogadoID[Ô]]);
//Pegando dados do Departamento
var id = parseInt($([Ô]#dep_id[Ô]).val());
var codigo = parseInt($([Ô]#dep_codigo[Ô]).val());
var cliid = parseInt($([Ô]#cli_id[Ô]).val());
var descricao = $([Ô]#dep_nome[Ô]).val();
debugger;
var serve = JSON.stringify({ issueID: $([Ô]#proselct option:selected[Ô]).val() });
$.ajax({
url : [ô]@Url.Action([Ô]Edit[Ô], [Ô]Departamento[Ô])[ô],
type: [Ô]POST[Ô],
headers: { [ô]__RequestVerificationToken[ô]: token },
datatype: [Ô]json[Ô],
data: { dep_id: id, dep_nome: descricao,dep_codigo: codigo,cli_id:cliid },
success: function (data) {
if (data.Resultado > 0) {
}
},
error: function (xhr) {
alert([ô]Error: [ô] + xhr.statusText);
}
});
});
});
Meu Controller
[HttpPost]
public async Task<ActionResult> Edit(int id ,DEPARTAMENTO departamento)
{
try
{
var client = new ClientApi();
string cliid = Session[[Ô]usuarioLogadoID[Ô]].ToString();
var json = [Ô]{[ô]dep_nome[ô]:[ô][Ô] + departamento.dep_nome + [Ô][ô],[ô]dep_codigo[ô]:[ô][Ô] + departamento.dep_codigo + [Ô][ô],[ô]cli_id[ô]:[ô][Ô] + cliid + [Ô][ô]}[Ô];
var response = await client.PutRequest([Ô]Departamento/[Ô] + id,json);
if (response.IsSuccessStatusCode)
{
TempData[[Ô]Sucesso[Ô]] = [Ô]Departamento alterado com sucesso[Ô];
return RedirectToAction([Ô]Index[Ô],[Ô]Departamento[Ô]);
}
if (response.StatusCode == HttpStatusCode.NotFound)
{
TempData[[Ô]Alerta[Ô]] = [Ô]Código do departamento não encontrado[Ô];
return RedirectToAction([Ô]Edit[Ô]);
}
}
catch(Exception ex)
{
TempData[[Ô]Perigo[Ô]] = ex.Message;
}
return View();
}
Meu Ajax
$(function () {
$([Ô]#btnAlterar[Ô]).click(function () {
//token para o ValidateAntiForgeryToken
var token = $([ô][name=__RequestVerificationToken][ô]).val();
var headers = {};
headers[[ô]__RequestVerificationToken[ô]] = token;
//Pegando o valor da session
var cliente = parseInt(@HttpContext.Current.Session[[Ô]usuarioLogadoID[Ô]]);
//Pegando dados do Departamento
var id = parseInt($([Ô]#dep_id[Ô]).val());
var codigo = parseInt($([Ô]#dep_codigo[Ô]).val());
var cliid = parseInt($([Ô]#cli_id[Ô]).val());
var descricao = $([Ô]#dep_nome[Ô]).val();
debugger;
var serve = JSON.stringify({ issueID: $([Ô]#proselct option:selected[Ô]).val() });
$.ajax({
url : [ô]@Url.Action([Ô]Edit[Ô], [Ô]Departamento[Ô])[ô],
type: [Ô]POST[Ô],
headers: { [ô]__RequestVerificationToken[ô]: token },
datatype: [Ô]json[Ô],
data: { dep_id: id, dep_nome: descricao,dep_codigo: codigo,cli_id:cliid },
success: function (data) {
if (data.Resultado > 0) {
}
},
error: function (xhr) {
alert([ô]Error: [ô] + xhr.statusText);
}
});
});
});
MOZARTJUNIOR,
Posta o trecho do código que tem o botão.
Posta o trecho do código que tem o botão.
<div class=[Ô]form-group[Ô]>
<div class=[Ô]col-md-6 col-sm-6 col-xs-6 [Ô]>
@Html.ActionLink([Ô]Voltar[Ô], [Ô]Index[Ô], new { Controller = [Ô]Departamento[Ô] }, new { @class = [Ô]btn btn-warning[Ô] })
<input type=[Ô]submit[Ô] value=[Ô]Alterar[Ô] id=[Ô]btnAlterar[Ô] class=[Ô]btn btn-primary[Ô] />
</div>
</div>
<div class=[Ô]col-md-6 col-sm-6 col-xs-6 [Ô]>
@Html.ActionLink([Ô]Voltar[Ô], [Ô]Index[Ô], new { Controller = [Ô]Departamento[Ô] }, new { @class = [Ô]btn btn-warning[Ô] })
<input type=[Ô]submit[Ô] value=[Ô]Alterar[Ô] id=[Ô]btnAlterar[Ô] class=[Ô]btn btn-primary[Ô] />
</div>
</div>
Tenta remover este atributo => type=[Ô]submit[Ô]
Ficando assim.
Ficando assim.
<input value=[Ô]Alterar[Ô] id=[Ô]btnAlterar[Ô] class=[Ô]btn btn-primary[Ô] />
Era isso, jamais imaginaria, value
Tenho analisado o modo de pensar da maioria do programadores. Sua Controller está executando duas vezes e o que você acha que o que está a mais é o submit. O que está a mais é todo esse AJAX. O submit está no lugar certo, o que tem que sair é esse monte de AJAX
Se eu sumir com o AJAX como vou fazer a requisição ?
Citação::
Se eu sumir com o AJAX como vou fazer a requisição ?
Pensa um pouco: você tem rotinas AJAX que estavam chamando o método. No botão também tinha um atributo [Ô]submit[Ô] isso fazia o seu método ser chamado duas vezes. Isso significa que tanto um quanto outro estão chamando o método. O que é mais simples? Uma série de javascript ou um atributo no botão?
MOZARTJUNIOR
Acontece que você tem um <form> com o método post, que já está fazendo a função para a chamada do seu método no backend. Quando você adicionou o atributo [Ô]Submit[Ô] no seu botão, que está dentro do seu form, o mesmo já entende que ao ser clicado ele irá realizar a chamada no backend.
O que você fez foi atribuir ao botão o comando click no javascript, assim você duplicou a chamada ao método.
Como o Kerplunk disse, você precisa definir o que você quer fazer, entender o que seu código está fazendo.
Acontece que você tem um <form> com o método post, que já está fazendo a função para a chamada do seu método no backend. Quando você adicionou o atributo [Ô]Submit[Ô] no seu botão, que está dentro do seu form, o mesmo já entende que ao ser clicado ele irá realizar a chamada no backend.
O que você fez foi atribuir ao botão o comando click no javascript, assim você duplicou a chamada ao método.
Como o Kerplunk disse, você precisa definir o que você quer fazer, entender o que seu código está fazendo.
Entendi, mais vou justificar pq criei a chamada ajax, quando criei a view simplesmente o botão não fazia nada, minha solução tem 2 projetos(API ,MVC) não sei pq agora eu deletei a chamada ajax e funcionou o clique do botão ele executa o controller, mais quando criei a view não estava indo para o controller.
Citação::
:
Se eu sumir com o AJAX como vou fazer a requisição ?
Pensa um pouco: você tem rotinas AJAX que estavam chamando o método. No botão também tinha um atributo [Ô]submit[Ô] isso fazia o seu método ser chamado duas vezes. Isso significa que tanto um quanto outro estão chamando o método. O que é mais simples? Uma série de javascript ou um atributo no botão?
Tópico encerrado , respostas não são mais permitidas