I hava a contact form, so that users can contact me. it is written in asp.net mvc, but the thing is that after submit without filled in any textbox, there comes no validation on the texboxes.
This is my form:
@using (Html.BeginForm("contact","Home", FormMethod.Post, new { @enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<section id="contact" class="text-center">
<div class="container">
<div class="row">
<div class="col-md-12 wow fadeInDown" data-wow-delay="2000">
<h3>CONTACT Microrout.nl</h3>
</div>
<div class="col-md-2"></div>
<div class="col-md-8">
Microrout.nl
<br />frederik hendriklaan 253-b
<br />Den Haag
<br />0641697144
</div>
<div class="col-md-2"></div>
<hr />
<div class="form-group">
<div class="col-md-10">
@Html.TextBoxFor(m => m.FromName, new {placeholder = "Your Name", @class = "form-control" })
@Html.ValidationMessageFor(m => m.FromName)
</div>
</div>
<div class="form-group">
<div class="col-md-10">
@Html.TextBoxFor(m => m.subject, new {placeholder = "Subject of message", @class = "form-control" })
@Html.ValidationMessageFor(m => m.subject)
</div>
</div>
<div class="form-group">
<div class="col-md-10">
@Html.TextBoxFor(m => m.FromEmail, new {placeholder ="Your email", @class = "form-control" })
@Html.ValidationMessageFor(m => m.FromEmail)
</div>
</div>
<div class="form-group">
<div class="col-md-10">
@Html.TextAreaFor(m => m.Message, new {placeholder = "Your message", @class = "form-control" })
@Html.ValidationMessageFor(m => m.Message)
</div>
</div>
<div class="form-group">
<div class="col-md-3">
<input type="submit" value="SHOOT MESSAGE" class="form-control">
</div>
</div>
</div>
</div>
@*<div class="google_map">
<div id="map-canvas"></div>
</div>*@
</section>
}
</section>
and this is my method in controller:
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Contact(EmailFormModel model)
{
string message2 = "There are a few errors";
if (ModelState.IsValid)
{
var body = "<p>Email From: {0} ({1})</p><p>Message:</p><p>{2}</p>";
var message = new MailMessage();
message.To.Add(new MailAddress("nengelen@online.nl")); //replace with valid value
message.Subject = model.subject;
message.Body = string.Format(body, model.FromName, model.FromEmail, model.Message);
message.IsBodyHtml = true;
using (var smtp = new SmtpClient())
{
await smtp.SendMailAsync(message);
}
message2 = "Thanks! We'll get back to you soon.";
//Response.Write("Error sending email: " + error.Message + "<br /> StackTrace: " + error.StackTrace);
//ViewBag.Message = "Thank you for contact us";
//return new RedirectToActionAnchor("Contact", "", "#contact");
}
if (Request.IsAjaxRequest())
{
return new JsonResult { Data = new { success = true, message = message2 } };
}
TempData["Message"] = message2;
return new RedirectResult(Url.Action("") + "#contact");
}
I have it now like this:
public ActionResult Contact()
{
EmailFormModel model = TempData["EmailFormModel"] as EmailFormModel;
ViewBag.Message = "Your contact page.";
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Contact(EmailFormModel model)
{
TempData["EmailFormModel"] = model;
string message2 = "There are a few errors";
if (ModelState.IsValid)
{
var body = "<p>Email From: {0} ({1})</p><p>Message:</p><p>{2}</p>";
var message = new MailMessage();
message.To.Add(new MailAddress("nengelen@online.nl")); //replace with valid value
message.Subject = model.subject;
message.Body = string.Format(body, model.FromName, model.FromEmail, model.Message);
message.IsBodyHtml = true;
using (var smtp = new SmtpClient())
{
await smtp.SendMailAsync(message);
}
return new RedirectResult(Url.Action("") + "#contact");
}
if (Request.IsAjaxRequest())
{
return new JsonResult { Data = new { succes = true, message = message2 } };
}
TempData["Message"] = message2;
return View(model);
}
and this is the model:
public class EmailFormModel
{
[Required, Display(Name="subject")]
public string subject { get; set; }
[Required, Display(Name = "Your name")]
public string FromName { get; set; }
[Required, Display(Name = "Your email"), EmailAddress]
public string FromEmail { get; set; }
[Required]
public string Message { get; set; }
}
I am using smoothScroll navigation, like this:
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="#home" class="smoothScroll">HOME</a></li>
<li><a href="#about" class="smoothScroll">STUDIO</a></li>
<li><a href="#team" class="smoothScroll">TEAM</a></li>
<li><a href="#service" class="smoothScroll">SERVICES</a></li>
<li><a href="#work" class="smoothScroll">WORK</a></li>
<li><a href="#pricing" class="smoothScroll">PRICING</a></li>
<li><a href="#contact" class="smoothScroll">CONTACT</a></li>
@*<li>@Html.ActionLink("Contact", "Contact", "Home")
</li>*@
</ul>
</div>
so in the navigation it jumps to the correct area of the index page
I have it now like this:
[HttpGet]
public ActionResult Contact(string uniqueUri)
{
EmailFormModel model = TempData["EmailFormModel"] as EmailFormModel;
//ViewBag.Message = "Your contact page.";
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Contact(EmailFormModel model)
{
TempData["EmailFormModel"] = model;
string message2 = "There are a few errors";
if (ModelState.IsValid)
{
var body = "<p>Email From: {0} ({1})</p><p>Message:</p><p>{2}</p>";
var message = new MailMessage();
message.To.Add(new MailAddress("nengelen@online.nl")); //replace with valid value
message.Subject = model.subject;
message.Body = string.Format(body, model.FromName, model.FromEmail, model.Message);
message.IsBodyHtml = true;
using (var smtp = new SmtpClient())
{
await smtp.SendMailAsync(message);
}
return new RedirectResult(Url.Action("") + "#contact");
}
else
{
ModelState.AddModelError("ReviewErrors", "some error occured");
//return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"] });
return new RedirectResult(Url.Action("") + "#contact");
}
}
I have it now like this:
public ActionResult Contact()
{
EmailFormModel model = TempData["EmailFormModel"] == null ? new EmailFormModel() : (EmailFormModel)TempData["EmailFormModel"];
ViewBag.Message = "Your contact page.";
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Contact(EmailFormModel model)
{
TempData["EmailFormModel"] = model;
string message2 = "There are a few errors";
if (ModelState.IsValid)
{
var body = "<p>Email From: {0} ({1})</p><p>Message:</p><p>{2}</p>";
var message = new MailMessage();
message.To.Add(new MailAddress("nengelen@online.nl")); //replace with valid value
message.Subject = model.subject;
message.Body = string.Format(body, model.FromName, model.FromEmail, model.Message);
message.IsBodyHtml = true;
using (var smtp = new SmtpClient())
{
await smtp.SendMailAsync(message);
}
return new RedirectResult(Url.Action("") + "#contact");
}
else
{
ModelState.AddModelError("ReviewErrors", "some error occured");
//return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"] });
return new RedirectResult(Url.Action("") + "#contact");
}
}
and in debug mode, if I dont fill in the fields, it comes in this:
else
{
ModelState.AddModelError("ReviewErrors", "some error occured");
//return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"] });
return new RedirectResult(Url.Action("") + "#contact");
}
but the validation is not visible
Thank you all for your efforts. But I just made an new contact page and now it works correct. Just have to figure out, with the correct linking in the navigation, but there for I just made new question. I just marked DaWood as the best solution, becuase you can' t make multiple marks as answare.
So thank you All!!