ASP.NET MVC Вызов действия по порядку? - PullRequest
0 голосов
/ 27 января 2019

У меня есть два действия. Один создает запись в моей таблице и сохраняет изменения в базе данных, а затем действие, которое отправляет эту запись по электронной почте.

Мне кажется, проблема в том, что действия выполняются одновременно, поэтому действие электронной почты не может получить требуемые данные, так как оно еще не было создано, поэтому оно захватывает предыдущую запись.

Я использую onclick для двух действий, поэтому это одна и та же кнопка.

Вид:

div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-warning" onclick="SendEmail()" />
            </div>
        </div>
    </div>
}

var SendEmail = function () {

    $.ajax({
        type: "Post",
        url: "/HolidayRequestForms/SendMailToManager",
        success: function (data) {

            alert("Success");


        }


    })

}

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

Создать:

 public ActionResult Create()
    {
        ViewBag.EmployeeID = new SelectList(db.Employees, "EmployeeID", "FullName");
        return View();
    }

    // POST: HolidayRequestForms/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "RequestID,EmployeeID,StartDate,FinishDate,HoursTaken,Comments,YearCreated,MonthCreated,DayCreated,YearOfHoliday,Approved")] HolidayRequestForm holidayRequestForm)
    {
        if (ModelState.IsValid)
        {
            db.HolidayRequestForms.Add(holidayRequestForm);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.EmployeeID = new SelectList(db.Employees, "EmployeeID", "FullName", holidayRequestForm.EmployeeID);
        return View(holidayRequestForm);
    }

Электронная почта:

public JsonResult SendMailToManager()
    {
        string name = Session["Name"].ToString();

        var AreaManagerEmailCatch = db.Employees.Where(s => s.Email.Equals(name)).Select(s => s.AreaManagerEmail);
        var ManagerEmailCatch = db.Employees.Where(s => s.Email.Equals(name)).Select(s => s.ManagerEmail);
        var StartDateCatch = db.HolidayRequestForms.Where(s => s.Employee.Email.Equals(name)).Select(s => s.StartDate);


        var des = (from a in db.Employees
                   where a.Email == name
                   select a.AreaManagerEmail);

        var ManEmail = (from b in db.Employees
                   where b.Email == name
                   select b.ManagerEmail);

        var SD = (from c in db.HolidayRequestForms.OrderByDescending(c => c.RequestID)
                        where (c.Employee.Email == name) && (c.Employee.EmployeeID == c.EmployeeID)
                        select c.StartDate);

        DateTime StartDate = SD.FirstOrDefault();
        string ManagerEmail = ManEmail.FirstOrDefault();
        string AreaManagerEmail = des.FirstOrDefault();



        bool result = false;

        result = SendEmail(AreaManagerEmail, "LotusWorks Holiday Request", "Hi there " + AreaManagerEmail + ",<br><br>[EmployeeEmail] has requested a holiday<br><br>The Employee will not be available to work From: <b>" + StartDate + "</b> to <b>[FinishDate]</b>.<br><br>Please forward this email to " + ManagerEmail + " with a response of Accept or Reject<br><br><br>Kind Regards,<br><br>LotusWorks Holiday Tracker");

        return Json(result, JsonRequestBehavior.AllowGet);

Можно ли сначала использовать действие создания, затем действие электронной почты, чтобы в письме была отправлена ​​нужная запись.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

У меня не было бы действия, которое отправляет электронное письмо. Вместо этого я бы сделал метод Email обычным методом в бизнес-классе и вызывал бы его, если запись создана.

if (ModelState.IsValid)
{
        db.HolidayRequestForms.Add(holidayRequestForm);
        int changes = db.SaveChanges();
        if(changes > 0){SendEmail();}
        return RedirectToAction("Index");
}
0 голосов
/ 27 января 2019

Есть ли способ, которым я могу сначала использовать действие создания, затем действие электронной почты, чтобы в письме была отправлена ​​нужная запись.

Конечно, имеет! Вы можете просто сделать следующее:

Сначала удалите onclick="SendEmail()" the из кнопки submit, поскольку она больше не нужна:

<input type="submit" value="Create" class="btn btn-warning"/>

Затем в методе Create POST в контроллере:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "RequestID,EmployeeID,StartDate,FinishDate,HoursTaken,Comments,YearCreated,MonthCreated,DayCreated,YearOfHoliday,Approved")] HolidayRequestForm holidayRequestForm)
{
    if (ModelState.IsValid)
    {
        db.HolidayRequestForms.Add(holidayRequestForm);
        db.SaveChanges();
        SendMailToManager(); // Call the SendMailToManager() method here. It will only be called if `holidayRequestForm` created successfully.
        return RedirectToAction("Index");
    }

    ViewBag.EmployeeID = new SelectList(db.Employees, "EmployeeID", "FullName", holidayRequestForm.EmployeeID);
    return View(holidayRequestForm);
}

Теперь обновите SendMailToManager() следующим образом:

private void SendMailToManager()
{
    string name = Session["Name"].ToString();

    var AreaManagerEmailCatch = db.Employees.Where(s => s.Email.Equals(name)).Select(s => s.AreaManagerEmail);
    var ManagerEmailCatch = db.Employees.Where(s => s.Email.Equals(name)).Select(s => s.ManagerEmail);
    var StartDateCatch = db.HolidayRequestForms.Where(s => s.Employee.Email.Equals(name)).Select(s => s.StartDate);


    var des = (from a in db.Employees
               where a.Email == name
               select a.AreaManagerEmail);

    var ManEmail = (from b in db.Employees
               where b.Email == name
               select b.ManagerEmail);

    var SD = (from c in db.HolidayRequestForms.OrderByDescending(c => c.RequestID)
                    where (c.Employee.Email == name) && (c.Employee.EmployeeID == c.EmployeeID)
                    select c.StartDate);

    DateTime StartDate = SD.FirstOrDefault();
    string ManagerEmail = ManEmail.FirstOrDefault();
    string AreaManagerEmail = des.FirstOrDefault();

    SendEmail(AreaManagerEmail, "LotusWorks Holiday Request", "Hi there " + AreaManagerEmail + ",<br><br>[EmployeeEmail] has requested a holiday<br><br>The Employee will not be available to work From: <b>" + StartDate + "</b> to <b>[FinishDate]</b>.<br><br>Please forward this email to " + ManagerEmail + " with a response of Accept or Reject<br><br><br>Kind Regards,<br><br>LotusWorks Holiday Tracker");

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