Действие контроллера вызывается дважды с поста Ajax - PullRequest
0 голосов
/ 19 февраля 2019

Уже много часов я ищу решение.Я занимаюсь разработкой приложений на C # и ASP.NET с использованием MVC.Это приложение для управления почтой.У меня есть страница, которая ищет дубликаты в базе данных компаний, а затем отображает ее в списке.Затем, когда пользователь нажимает на название компании, он попадает на страницу, которая отображает дубликаты для этой компании.

Для этого на странице поиска я сделал Ajax-запрос к своему действию контроллера «Fiche», который будет использовать параметры, отправленные для построения запроса и возврата модели представления, заполненной дубликатами компании.

Действие вызывается один раз, с правильными параметрами, но затем оно вызывается дважды, с параметрами, установленными в falseдля логических значений и нуль для строки.Поэтому мне не удается найти дубликаты для компании.Вот мое событие нажатия:

$(a).click(function () {
        //some code that sets the variables used in cc
        var cc = {
            rsoc: raison_sociale,
            adr1: adresse,
            cp: code_postal,
            ville: ville_entreprise,
            tel: telephone,
            mail: e_mail,
            user_id: code_cotisant,
            profileConf: sessionStorage.getItem('categ')
        }
        $.ajax({
            url: "@Url.Action("Fiche", "Doublons")",
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify({ cc: cc, rsoc: $(this).text() }),
            success: function(response) {
                response ? alert("It worked!") : alert("It didn't work.");
            }
        });
    })

Вот действие моего контроллера:

public ActionResult Fiche(CompareConfiguration cc, string rsoc)
    {
        bool categorie = cc.profileConf != null ? true : false;
        Models.Entreprise entreprise = new Models.Entreprise();
        DataTable dt_doublons = new DataTable();
        if (rsoc != null)
        {
            dt_doublons = entreprise.search_doublons(cc.Rsoc, cc.Adr1, cc.CP, cc.Ville, cc.Tel, cc.Mail, cc.User_Id, categorie, cc.profileConf.Split(','));
            for (int i = 0; i < dt_doublons.Rows.Count; i++)
            {
                if(rsoc != dt_doublons.Rows[i]["rsoc"].ToString())
                {
                    dt_doublons.Rows[i].Delete();
                }
            }
            dt_doublons.AcceptChanges();
        }

        return View(getDoublons(dt_doublons));
    }

    private DoublonsViewModel getDoublons(DataTable dt_doublons)
    {
        DoublonsViewModel dblVM = new DoublonsViewModel()
        {
            ListeDoublons = new List<EntrepriseAndContacts>(),
            dt_doublons = dt_doublons
        };

        for (int i = 0; i < dt_doublons.Rows.Count; i++)
        {
            EntrepriseAndContacts eac = new EntrepriseAndContacts();

            eac.Id = Convert.ToInt32(dt_doublons.Rows[i]["id_entreprise"]);
            eac.Rsoc = dt_doublons.Rows[i]["rsoc"].ToString();
            eac.nb_doublons = Convert.ToInt32(dt_doublons.Rows[i]["nb_doublons"]);
            eac.Etat_entreprise = Convert.ToInt32(dt_doublons.Rows[i]["importee"]);
            eac.Etat_contact = Convert.ToInt32(dt_doublons.Rows[i]["importe"]);
            eac.User_id = dt_doublons.Rows[i]["user_id"].ToString();
            eac.CVI = dt_doublons.Rows[i]["cvi"].ToString();
            eac.Nom = dt_doublons.Rows[i]["nom"].ToString();
            eac.Prenom = dt_doublons.Rows[i]["prenom"].ToString();
            eac.Mail = dt_doublons.Rows[i]["mail"].ToString();

            dblVM.ListeDoublons.Add(eac);
        }

        return dblVM;
    }

И ссылка:

foreach (var doublon in Model.ListeDoublons)
  {
    <tr>
      <td class="center size-15 height-25">
        <a href="@Url.Content("~/Doublons/Fiche")">@doublon.Rsoc</a>
      </td>
      <td class="center size-15 height-25">@doublon.nb_doublons</td>
    </tr>
  }

Я пытался вернуть false илипредотвратите событие события click, но представление «Fiche» больше не загружалось, поэтому в данном случае это не решение.Должно быть, я что-то не так делаю!

Редактировать: я добавил [HttpPost] до своего действия, но теперь представление не найдено.

1 Ответ

0 голосов
/ 20 февраля 2019

Надеюсь, на этот раз я смогу опубликовать ответ, потому что нашел решение своей проблемы.Я удалил [HttpPost] перед действием Fiche и, впервые передав метод, сохранил параметры cc и rsoc в двух переменных сеанса.Затем я переназначаю его на cc и rsoc, поэтому, когда он второй раз переходит в метод с пустыми значениями cc и rsoc, он извлекает их в сеансе.Это не хорошее решение, но у меня нет времени, и оно работает.

public ActionResult Fiche(CompareConfiguration cc, string rsoc)
    {
        if(cc.Adr1 != false || cc.Rsoc != false || cc.CP != false || cc.Ville != false || cc.Tel != false || cc.Mail != false || cc.User_Id != false)
        {
            Session["cc"] = cc;
            Session["rsoc_entreprise"] = rsoc;
        }

        cc = (CompareConfiguration)Session["cc"];
        rsoc = Session["rsoc_entreprise"].ToString();
        bool categorie = cc.profileConf != null ? true : false;
        Models.Entreprise entreprise = new Models.Entreprise();
        DataTable dt_doublons = new DataTable();
        if (rsoc != null)
        {
            dt_doublons = entreprise.search_doublons(cc.Rsoc, cc.Adr1, cc.CP, cc.Ville, cc.Tel, cc.Mail, cc.User_Id, categorie, cc.profileConf.Split(','));
            for (int i = 0; i < dt_doublons.Rows.Count; i++)
            {
                if(rsoc != dt_doublons.Rows[i]["rsoc"].ToString())
                {
                    dt_doublons.Rows[i].Delete();
                }
            }
            dt_doublons.AcceptChanges();
        }

        return View(getDoublons(dt_doublons));
    }
...