【问题标题】:Postback when validating ASP.NET MVC Form验证 ASP.NET MVC 表单时的回发
【发布时间】:2014-04-28 08:59:44
【问题描述】:

我使用 asp.net mvc 脚手架创建了一个 Web 表单表单,它在没有回发的情况下无法进行客户端验证。 [Required()] 是回发,[EmailAddress] 验证器正在客户端进行验证。我使用 Visual Studio 2013 和带有 ef6 的 asp.net mvc 5。 这个 id 我的模型类:

namespace WebApplication4.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

public partial class Tutor
{
    public Tutor()
    {
        this.Examinations = new HashSet<Examination>();
    }


    public decimal TutorID { get; set; }

    [Display(Name = "First Name ")]
    [Required(ErrorMessage = "Please Enter First Name.")]
    [DataType(DataType.Text)]
    public string FirstName { get; set; }

    [Display(Name = "Last Name ")]
    [Required(ErrorMessage = "Please Enter Last Name.")]
    [DataType(DataType.Text)]
    public string LastName { get; set; }

    [Display(Name = "Address Line 1 ")]
    [Required(ErrorMessage = "Please Enter Address Line 1.")]
    [DataType(DataType.Text)]
    public string Address1 { get; set; }

    [Display(Name = "Address Line 2 ")]
    [Required(ErrorMessage = "Please Enter Address Line 2.")]
    [DataType(DataType.Text)]
    public string Address2 { get; set; }

    [Display(Name = "Address Line 3 ")]
    public string Address3 { get; set; }

    [Display(Name = "Telephone 1 ")]
    [Required(ErrorMessage = "Please Enter Telephone No.")]
    [DataType(DataType.Text)]
    public string Tel1 { get; set; }

    [Display(Name = "Telephone 2 ")]
    [DataType(DataType.Text)]
    public string Tel2 { get; set; }

    [Display(Name = "Email Address")]
    [Required(ErrorMessage = "Please Enter E Mail Address.")]
    [EmailAddress(ErrorMessage = "Invalid Email Address")]
    [DataType(DataType.EmailAddress)]
    public string EMail { get; set; }

    [Display(Name = "Password ")]
    [DataType(DataType.Password)]
    public string Password { get; set; }
    public Nullable<bool> IsConfirmed { get; set; }

     public virtual ICollection<Examination> Examinations { get; set; }
    }
}

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

    // GET: /Default1/Create
    public ActionResult Create()
    {
        return View();
    }

    // POST: /Default1/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include="TutorID,FirstName,LastName,Address1,Address2,Address3,Tel1,Tel2,EMail,Password,IsConfirmed")] Tutor tutor)
    {
        if (ModelState.IsValid)
        {
            db.Tutors.Add(tutor);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(tutor);
    }

这是创建视图...

  @model WebApplication4.Models.Tutor

  @{
     ViewBag.Title = "Create";
     Layout = "~/Views/Shared/_Layout.cshtml";
   }

   <h2>Create</h2>


   @using (Html.BeginForm()) 
    {
     @Html.AntiForgeryToken()

     <div class="form-horizontal">
      <h4>Tutor</h4>
      <hr />
      @Html.ValidationSummary(true)

      <div class="form-group">
        @Html.LabelFor(model => model.FirstName, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.FirstName)
            @Html.ValidationMessageFor(model => model.FirstName)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.LastName, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.LastName)
            @Html.ValidationMessageFor(model => model.LastName)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Address1, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Address1)
            @Html.ValidationMessageFor(model => model.Address1)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Address2, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Address2)
            @Html.ValidationMessageFor(model => model.Address2)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Address3, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Address3)
            @Html.ValidationMessageFor(model => model.Address3)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Tel1, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Tel1)
            @Html.ValidationMessageFor(model => model.Tel1)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Tel2, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Tel2)
            @Html.ValidationMessageFor(model => model.Tel2)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.EMail, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.EMail)
            @Html.ValidationMessageFor(model => model.EMail)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Password, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Password)
            @Html.ValidationMessageFor(model => model.Password)
        </div>
    </div>



    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
}

<div>
     @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

我想在客户端验证所有的东西。

【问题讨论】:

    标签: c# ajax asp.net-mvc


    【解决方案1】:

    确保正确加载 jquery.validate.js 库

    BundleConfig.cs

    bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                            "~/Scripts/jquery.unobtrusive*",
                            "~/Scripts/jquery.validate*"));
    

    在页面末尾

    @Scripts.Render("~/bundles/jqueryval")
    

    【讨论】:

      【解决方案2】:

      解决方案是使用 jquery.validate.unobtrusive.js。

      加载表单后,在文档上使用 jquery 即可解析表单

      //file: your view file
      @model Tutor
      
      <script>
      $(document).ready(function() {
         $.validator.unobtrusive.parse($("#frm1"));
      }
      
      function onSubmit(e) {
        $("#frm1").validate(); // this will validate the form and show the validation messages
        if($("#frm1").valid()) {
           $("#frm1").submit(); // submits the form
        }
        return false;//prevent default submit of form by returning false.
        //also e.preventDefault() can be used.
      }
      </script>
      
      //for understanding purpose using the plain form tag.
      //one can use  @using (Html.BeginForm())
      
      <form id="frm1" onsubmit="onSubmit();">
      <!-- your content goes here -->
         <div class="form-group">
              @Html.LabelFor(model => model.FirstName, new { @class = "control-label col-md-2" })
              <div class="col-md-10">
                  @Html.EditorFor(model => model.FirstName)
                  @Html.ValidationMessageFor(model => model.FirstName)
              </div>
          </div>
      
      </form>
      

      【讨论】:

        猜你喜欢
        • 2014-07-29
        • 1970-01-01
        • 1970-01-01
        • 2013-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-10
        相关资源
        最近更新 更多