在Bootstrap Modal中通过ActionLink发送电子邮件

时间:2016-11-13 14:32:06

标签: asp.net-mvc twitter-bootstrap email

我正在开发一个小型的“Rent-a-car”应用程序。我有一个客户可以看到的汽车列表,我想在该列表上实现“订单功能”。每辆车都应该有他的订单按钮。当客户选择汽车并按下“订单”按钮时,我想打开Bootstrap Modal,上面写着“您想订购客户选择的汽车”,请输入您的个人信息。然后他会输入他的姓名,电子邮件和电话号码。当他进入该状态时,他将按下该模式上的“提交”按钮,他将收到类似“我们发送了一个付款链接和支付您的电子邮件的说明。”请查看您的电子邮件。然后,客户端将收到一封电子邮件,上面写着“您想订购客户选择的汽车。请阅读以下说明:一些文字”

我想我可以使用Action Links执行此操作,但我不知道如何在现有代码中实现它

请注意:不必使用Bootstrap Modals。我打开你的建议。请查看我现有的代码。

这是我的车型:

public class Car
{
    [Key]
    public int CarID { get; set; }
    public string Model { get; set; }
    [DisplayName("Year of production")]
    public int YearOfProduction { get; set; }
    public string Price { get; set; } 
    public virtual ICollection<FilePath> FilePaths { get; set; }
    [DisplayName("Air Conditioning")]
    public string AirConditioning { get; set; }
    [DisplayName("Engine")]
    public string EngineType { get; set; }
    public string Transmission { get; set; }
    public string Suitcases { get; set; }
    public string Seats { get; set; }
}

这是我的汽车控制器:

 public class CarsController : Controller
 {
    private CarContext db = new CarContext();

    // GET: Cars
    public ActionResult Index()
    {
        return View(db.Cars.ToList());
    }

    // GET: Cars/Details/5
    public ActionResult Details(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        //Car car = db.Cars.Find(id);
        Car car = db.Cars.Include(i => i.FilePaths).SingleOrDefault(i => i.CarID == id);
        if (car == null)
        {
            return HttpNotFound();
        }
        return View(car);
    }

    // GET: Cars/Create
    [Authorize(Roles = "Administrator")]
    public ActionResult Create()
    {
        return View();
    }

    // POST: Cars/Create
    [Authorize(Roles = "Administrator")]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "CarID,Model,YearOfProduction,Price,AirConditioning,EngineType,Transmission, Suitcases, Seats")] Car car, HttpPostedFileBase upload)
    {
        if (ModelState.IsValid)
        {
            if (upload != null && upload.ContentLength > 0)
            {
                var photo = new FilePath
                {
                    FileName = Guid.NewGuid().ToString() + System.IO.Path.GetExtension(upload.FileName), //uniqueness of the file name
                    FileType = FileType.Photo
                };
                car.FilePaths = new List<FilePath>();
                upload.SaveAs(Path.Combine(Server.MapPath("~/Images/Cars"), photo.FileName));
                car.FilePaths.Add(photo);

            }
            db.Cars.Add(car);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(car);
    }



    // GET: Cars/Edit/5
    [Authorize(Roles = "Administrator")]
    public ActionResult Edit(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Car car = db.Cars.Find(id);
        if (car == null)
        {
            return HttpNotFound();
        }
        return View(car);
    }


    [Authorize(Roles = "Administrator")]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "CarID,Model,YearOfProduction,Price,AirConditioning,EngineType,Transmission, Suitcases, Seats")] Car car, HttpPostedFileBase upload)
    {
        if (ModelState.IsValid)
        {
            if (upload != null && upload.ContentLength > 0)
            {
                var photo = new FilePath
                {
                    FileName = Guid.NewGuid().ToString() + System.IO.Path.GetExtension(upload.FileName), //uniqueness of the file name
                    FileType = FileType.Photo
                };
                car.FilePaths = new List<FilePath>();
                upload.SaveAs(Path.Combine(Server.MapPath("~/Images/Cars"), photo.FileName));
                car.FilePaths.Add(photo);

            }
            db.Cars.Add(car);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(car);
    }

    // GET: Cars/Delete/5
    [Authorize(Roles = "Administrator")]
    public ActionResult Delete(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Car car = db.Cars.Find(id);
        if (car == null)
        {
            return HttpNotFound();
        }
        return View(car);
    }

    // POST: Cars/Delete/5
    [Authorize(Roles = "Administrator")]
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteConfirmed(int id)
    {
        Car car = db.Cars.Find(id);
        db.Cars.Remove(car);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }
}

这是我的汽车控制器的索引视图,其中我列出了汽车和模型的订购:

@model IEnumerable<Testing_identity_2.Models.Car>

@{
ViewBag.Title = "Index";
}

<h2>AVAILABLE CARS</h2>

@if (ViewContext.HttpContext.User.IsInRole("Administrator"))
{
<p>
    @Html.ActionLink("Create New", "Create")
</p>
}

<table class="table">
<tr>
    <th>
        @Html.DisplayNameFor(model => model.Model)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Price)
    </th>
    <th></th>
</tr>

@foreach (var item in Model)
{
    <tr>
        <td class="col-md-3">
            @Html.DisplayFor(modelItem => item.Model)
        </td>
        <td class="col-md-2">
            @Html.DisplayFor(modelItem => item.Price)
        </td>

        <td>

            <button class="btn btn-default btn-sm"  data-target="#orderModal" data-toggle="modal">Order</button>

            @Html.ActionLink("Details", "Details", new {id = item.CarID}, new {@class = "btn btn-default btn-sm"})

            @if (ViewContext.HttpContext.User.IsInRole("Administrator"))
            {
                @Html.ActionLink("Edit", "Edit", new {id = item.CarID}, new {@class = "btn btn-default btn-sm"})
            }

            @if (ViewContext.HttpContext.User.IsInRole("Administrator"))
            {
                @Html.ActionLink("Delete", "Delete", new {id = item.CarID}, new {@class = "btn btn-default btn-sm"})
            }

        </td>
    </tr>    
}

</table>

<div class="modal" data-keyboard="false" data-backdrop="static" id="orderModal" tabindex="-1">
<div class="modal-dialog">
    <div class="modal-content">
        <div class="modal-header">
            <h4 class="modal-title">Please enter your personal information</h4>
        </div>
        <div class="modal-body">
            <form>
                <div class="form-group">
                    <label for="inputName">Name</label>
                    <input class="form-control" placeholder="Name" type="text" id="inputName" />
                </div>
                <div class="form-group">
                    <label for="inputEmail">Email</label>
                    <input class="form-control" placeholder="Email"  type="text" id="inputEmail" />
                </div>
                <div class="form-group">
                    <label for="inputPhoneNumber">Phone Number</label>
                    <input class="form-control" placeholder="Phone Number" type="text" id="inputPhoneNumber" />
                </div>
            </form>
        </div>
        <div class="modal-footer">
            <button id="btnSubmitModal" class="btn  btn-primary">Submit</button>
            <button class="btn btn-primary" id="btnHideModal2">Close</button>
        </div>
    </div>
</div>
</div>


<div class="modal" data-keyboard="false" data-backdrop="static"  id="orderModal1" tabindex="-1">
<div class="modal-dialog">
    <div class="modal-content">
        <div class="modal-header">

        </div>
        <div class="modal-body">
            <form>
                <h4 class="modal-title">We sent a payment link on your email.</h4>
                <br />
                <h4 class="modal-title">Please check your email.</h4>
            </form>
        </div>
        <div class="modal-footer">
            <button class="btn btn-primary"  id="btnHideModal1">Close</button>
        </div>
    </div>
</div>
</div>


<script type="text/javascript">
$(document).ready(function() {

    $('#btnSubmitModal').click(function () {
        $('#orderModal').modal('hide');
    });

   $('#orderModal').on('hide.bs.modal', function (){
        $('#orderModal1').modal('show');
   });

   $('#btnHideModal1').click(function () {
       $('#orderModal1').modal('hide');
   });

    $('#btnHideModal2').click(function () {
        $('#orderModal').modal('hide');
        $('#orderModal1').modal('hide');
    });

    });
</script>

1 个答案:

答案 0 :(得分:0)

您要求的有几件事。首先,您需要在@foreach循环中添加带有绑定ID的actionlink标记,例如:

@Html.Actionlink("Order car here!", "Order", new { id=item.CarID })

控制器actionresult看起来与此相似:

Public ActionResult Order(int id)
{
return View("Order");
}

其次,您希望拥有一个订单页面,用户可以使用razor或angularJS输入数据。我建议您使用单独的模型来存储用户数据:

class client
{
 public int userID { get; set; }
 public string email { get; set; }
 public string Name { get; set; }
 public int PhoneNumber { get; set; }
}

示例订单页面:

<div>
  <div>
    @Html.Label("emailaddress","Email address")
    @Html.Editor("Email")
  </div>
  <div>
    @Html.Label("NameLabel", "First Name")
    @Html.Editor("Name")
  </div>
  <div>
    @Html.Label("PhoneNumberLabel", "Phone Number")
    @Html.Editor("PhoneNumber")
  </div>
 @Html.ActionLink("Submit order form", "submitOrder", new { email=Model.email, name=Model.name, PhoneNumber=Model.PhoneNumber})
</div>

请注意:订单表格粗略,需要一些工作才能提交表格数据。然后,表单会将此数据提交给将使用SMTP命名空间(ActionResult)的另一个System.Net.Mail

public ActionResult subOrder(string email, string name, 
{
 MailMessage mail = new MailMessage("exampleNoReponseEmail@emailexample.com", email);
SmtpClient client = new SmtpClient();
client.Port = 25;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Host = "smtp.google.com";
mail.Subject = "Car payment conformation";
mail.Subject = "Dear, " + name + ", "You want to order car that the client selected . Please read following instructions: Some text";
client.Send(mail);
return View("ConfirmPayment");
}

确认电子邮件视图:

<h1>Email Sent!</h1>
<p>We sent a payment link and instruction for paying on your email. Please check your email.</p>

这些关于发送电子邮件的链接也可能有所帮助: 1. Send e-mail via SMTP using C#
2. Sending email in .NET through Gmail
3. https://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage(v=vs.110).aspx
4. https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient(v=vs.110).aspx
我希望这有帮助!