asp.net-mvc ajax json сообщение для метода действия контроллера - PullRequest
0 голосов
/ 25 октября 2018

Я знаю, что на те же вопросы есть ответы, но они не работают в моем проекте.У меня есть контроллер, где я отправляю сообщение сотруднику.Я взял с AJAX.электронную почту, которую я беру с БД.но getEmployeeEmail () возвращает мне мою электронную почту (это правильно) Имя контроллера: EmployersActivity

Код не работает, когда я отправляю сообщение.Мой ajax почтовый индекс:

$(document).ready(function () {
        $(".buttonSendEmail").click(function () {
            var orderText = $(".orderData").text();
            alert(orderText);
            $.ajax({
                type: "POST",
                contentType: 'application/json; charset=utf-8',
                url: "@(Url.Action("Create", "EmployersActivity"))",
                data: { id: 1 },
                dataType: "json",
                traditional: true,
                error: function (message) {
                    alert("error on start")
                    $(".contentReqGood").show();
                    redirect();
                },
                success: function (result) {
                    if (result.status === 1) {
                        alert("error")
                    } else {
                        $(".contentReqGood").show();
                        redirect();}})})});

asp.net mvc код:

    [HttpGet]
    [Authorize]
    public ActionResult Create()
    {
        return View();
    }

    [HttpPost]
    [Authorize]
    [ValidateAntiForgeryToken]
    public ActionResult Create(int? id)
    {
        if (id == null)
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

        var email = db.employees.Find(id);
        if (email == null)
            return HttpNotFound();
        if (email != null)
        {


            if (db.SaveChanges() == 1)
            {
                string mailTemplate;
                string title = "asdasd";
                string preview = "asdasdasd";
                var sr = new StreamReader(Server.MapPath("~/App_Data/Templates/" + "InfoEmail.txt"));

                mailTemplate = sr.ReadToEnd();

                string messageBody = string.Format(mailTemplate, title, preview);

                new MailSender
                {
                    Sender = "news@omegasoftware.eu",
                    Recipient = "news@omegasoftware.eu",
                    RecipientsBcc = getEmployeeEmail(),
                    Subject = title,
                    Body = messageBody
                }.Send();}}
        return View();}

1 Ответ

0 голосов
/ 26 октября 2018

У вас есть несколько проблем, связанных с текущим примером:

1) [Authorize] атрибут не нужен в методе POST, потому что его использование в методе действия GET должно быть достаточно для предотвращения неавторизованных пользователей.

2) Поскольку вы отправляете запрос AJAX методу POST, который включает атрибут [ValidateAntiForgeryToken], необходимо отправить токен предотвращения CSRF в запрос AJAX.

3) Удалить dataType: "json", contentType: 'application/json; charset=utf-8' и traditional: true так как вы отправляете одно целочисленные данные и не используете массив или строку в формате JSON.

4) Обратные вызовы AJAX предназначены для того, чтобы оставаться на той же странице, поэтому return View() следует заменить на return PartialView().

Исходя из 4 вышеизложенных вопросов, если необходимо использовать AJAX, вы должны установить запрос и действие контроллера, как показано в следующем примере:

Запрос AJAX

$(document).ready(function () {
    $(".buttonSendEmail").click(function () {
        var orderText = $(".orderData").text();
        alert(orderText);

        var form = $('form');
        var token = $('input[name="__RequestVerificationToken"]', form).val();

        $.ajax({
            type: "POST",
            url: "@Url.Action("Create", "EmployersActivity")",
            data: { id: 1, __RequestVerificationToken: token },
            error: function (message) {
                alert("error on start");
                // other stuff
            },
            success: function (result) {
                $(".contentReqGood").show();
                // other stuff
            }
        });
    });
});

Действие контроллера

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(int? id)
{
    if (id == null)
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

    var email = db.employees.Find(id);
    if (email == null)
        return HttpNotFound();
    if (email != null)
    {
        // do something
    }
    return PartialView("_PartialViewName");
}

Кроме этого, если вы хотите передать весь контент viewmodel в метод действия POST или использовать перенаправление с RedirectToAction() после submэто, тогда вы должны использовать обычную форму отправки (с Html.BeginForm() помощник) вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...