【问题标题】:Validation is not visible验证不可见
【发布时间】:2015-07-16 18:51:54
【问题描述】:

我有一个联系表,以便用户可以联系我。它是用asp.net mvc编写的,但问题是提交后没有填写任何文本框,texboxes没有验证。

这是我的表格:

@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>

这是我在控制器中的方法:

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");
        }

我现在是这样的:

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);

        }

这是模型:

 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; }
    }

我用的是smoothScroll导航,像这样:

<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>

所以在导航中它会跳转到索引页面的正确区域

我现在是这样的:

[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");
            }


        }

我现在是这样的:

        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");
            }


        }

在调试模式下,如果我不填写字段,它会出现:

else
                {
                    ModelState.AddModelError("ReviewErrors", "some error occured");
                    //return RedirectToAction("Create", new { uniqueUri = Request.RequestContext.RouteData.Values["uniqueUri"] });
                    return new RedirectResult(Url.Action("") + "#contact");
                }

但验证不可见

感谢大家的努力。但我刚刚创建了一个新的联系页面,现在它可以正常工作了。只需要弄清楚导航中的正确链接,但我刚刚提出了新问题。我只是将 DaWood 标记为最佳解决方案,因为您不能将多个标记作为答案。

谢谢大家!!

【问题讨论】:

  • 您的 POST 方法中有什么 if (Request.IsAjaxRequest())?您是使用 ajax 提交表单(在这种情况下不会显示验证错误)还是正常提交​​?
  • 提交后好像在做full post

标签: c# asp.net-mvc-4


【解决方案1】:

你不见了:

if (!ModelState.IsValid)
{
    return View(model);
}

您需要渲染有问题的视图。然后框架将拾取验证错误并显示它们。

【讨论】:

  • 昨天遇到了同样的问题,解决方法是这样的,如果在Render的时候不使用if(!ModelState.IsValid),加载初始值。很好
  • 我试过了。但验证仍然不可见
  • ok,我把 if(!modelState.IsValid) 放在哪里?那么之后呢? if (ModelState.IsValid){}?问题是我不能返回视图(模型),因为联系人的 url 是:localhost:53534/#contact
  • 应该在控制器动作方法的最顶端。不知道它如何处理 url 段
【解决方案2】:

之后

if(ModelState.IsValid)

你在打电话:

 return new RedirectResult(Url.Action("") + "#contact");

刷新页面并清除模型状态。

如果您需要调用 RedirectResult 请点击此链接

ASP.NET MVC - How to Preserve ModelState Errors Across RedirectToAction?

您需要返回 View(model) 以获取验证错误。

if(ModelState.IsValid)
{
 // ...........Other Code:
 return new RedirectResult(Url.Action("") + "#contact");
}
if (Request.IsAjaxRequest())
{
return new JsonResult { Data = new { success = true, message = message2 } };
}

TempData["Message"] = message2;    
return View(model);

编辑:

public ActionResult Contact()
{
  EmailFormModel model = TempData["EmailFormModel"] == null ? new EmailFormModel() : (EmailFormModel) TempData["EmailFormModel"]; 
  ViewBag.Message = "Your contact page.";
  return View(model);
}

【讨论】:

【解决方案3】:

模型状态无效时需要添加else。并将您的回报移动到 if 中,这样当模型状态有效时,您就可以在模型的肯定检查中返回。当模型状态无效时返回视图,这将保留您的模型状态数据。

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");
            TempData["Message"] = message2;
        if (Request.IsAjaxRequest())
        {
            return new JsonResult { Data = new { success = true, message = message2 } };
        }

            return new RedirectResult(Url.Action("") + "#contact");
        }
        else
        {
            return View();
        }

此外,如果模型无效,您可能希望启用内置客户端验证以保存到服务器的往返行程。

【讨论】:

  • 你的 if (Request.IsAjaxRequest()) 永远不会被执行
  • 但现在不会调用 if()
  • 糟糕。编辑了我的答案
  • 嗨,Truk,感谢您的编辑,但问题也在这里:return View() 转到:localhost:53534/Home/contact,但联系链接是:localhost:53534/#contact
  • 您只想返回帖子来自的视图,以便用户可以看到验证消息。将 View() 留空将返回与您所在的控制器操作名称相同的视图。如果要调用特定视图,可以显式调用它,例如 return View("your view name here") 。此时您不想调用控制器操作,只是返回带有错误消息的视图。如果您调用该操作,它将返回一个不包含错误消息的新视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 2012-06-20
  • 1970-01-01
相关资源
最近更新 更多