预提交必填字段验证 ASP .NET MVC

Posted

技术标签:

【中文标题】预提交必填字段验证 ASP .NET MVC【英文标题】:Pre submission required field validation ASP .NET MVC 【发布时间】:2017-05-19 01:15:17 【问题描述】:

我的响应时间如此之快,并且对我的第一个问题很有帮助,所以我想我会在这里提出另一个问题。

目前我有一个进行表单验证的应用程序。我的问题是它仅在提交后显示必填字段或表单验证。但是我希望它在它旁边显示一个星号或验证消息,直到有一些文本或满足验证要求。

因此,当您转到空白表单时,所有必填字段都应该有一条消息或星号,当我键入或满足字段要求时,该消息应该消失。

我只能在提交后让它这样做。

这是我的相关代码sn-ps....

查看代码

@using (html.BeginForm("Register", "Account", FormMethod.Post, new  @class = "form-horizontal", role = "form" ))

    @Html.AntiForgeryToken()
    <h4>Create a new account.</h4>
    <hr />
   // @Html.ValidationSummary("", new  @class = "text-danger" )

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

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

控制器代码

[AllowAnonymous]
public ActionResult Register()
   
    return View();


//
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)

    if (ModelState.IsValid)
    
        var user = new ApplicationUser  UserName = model.Email, Email = model.Email, FirstName = model.FirstName,
        LastName = model.LastName, PhoneNumber = model.PhoneNumber;
        var result = await UserManager.CreateAsync(user, model.Password);

        if (result.Succeeded)
        
            await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

            // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
            // Send an email with this link
            // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
            // var callbackUrl = Url.Action("ConfirmEmail", "Account", new  userId = user.Id, code = code , protocol: Request.Url.Scheme);
            // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

            return RedirectToAction("Index", "Home");
        
        AddErrors(result);
    

    // If we got this far, something failed, redisplay form
    return View(model);

型号代码

public class RegisterViewModel

    [Required]
    public string FirstName  get; set; 

网页配置代码

        <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusivejavascriptEnabled" value="true" />
    <add key="vs:EnableBrowserLink" value="false" />
  </appSettings>

捆绑配置代码

public class BundleConfig

    // For more information on bundling, visit http://go.microsoft.com/fwlink/?LinkId=301862
    public static void RegisterBundles(BundleCollection bundles)
    
        bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-version.js"));

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

        // Use the development version of Modernizr to develop with and learn from. Then, when you're
        // ready for production, use the build tool at http://modernizr.com to pick only the tests you need.
        bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                    "~/Scripts/modernizr-*"));

        bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
                  "~/Scripts/bootstrap.js",
                  "~/Scripts/respond.js"));

        bundles.Add(new StyleBundle("~/Content/css").Include(
                  "~/Content/bootstrap.css",
                  "~/Content/site.css"));
    

正如您从控制器中看到的那样,还有更多工作要做,但为简单起见,我只想关注一个字段,即名称。

【问题讨论】:

是否启用客户端验证? @KimHoang 是的,我开启了客户端验证。我将更新我的问题。 【参考方案1】:

你需要使用不显眼的估值

1) 通过 nuget 安装:https://www.nuget.org/packages/jQuery.Validation.Unobtrusive/ 这将在我们的 Scripts 目录中安装一堆 javascript 文件

2) 编辑你的 bundleConfig

public static void RegisterBundles(BundleCollection bundles)  

    bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                "~/Scripts/jquery-version.js"));

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

3) 您需要在页面上的某处呈现不显眼的脚本,如下所示:

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

这应该让你开始。

有关如何执行此操作的完整指南在这里:

https://www.exceptionnotfound.net/asp-net-mvc-demystified-unobtrusive-validation/

【讨论】:

这看起来很有希望,谢谢,午饭后我会测试一下。 回到它,我刚刚通读了这篇文章,我已经有了所有的设置...... 我已经决定这是尽可能接近的,无需更多代码。它确实会立即为您提供验证,但仅在第一次提交之后。因此,如果您提交一个空表单,那么所有消息都会实时与您作出反应,但这取决于第一次提交。【参考方案2】:

客户端验证是使用 jquery 完成的。确保您的页面中包含 jquery 和验证脚本。

<script src=".../Scripts/jquery.validate.js"></script>
<script src=".../Scripts/jquery.validate.unobtrusive.js"></script>

【讨论】:

这不是做所有的工作吗?您仍然必须按照说不的方式做一些事情?

以上是关于预提交必填字段验证 ASP .NET MVC的主要内容,如果未能解决你的问题,请参考以下文章

Asp:Net 必填字段将验证组的控件变回红色

使用 Select2 ASP.NET MVC 时进行不显眼的验证

在 asp.net mvc razor 页面中验证 jquery 中的特定表单字段

ASP.Net MVC开发基础学习笔记:四校验AJAX与过滤器

ASP.NET Web 窗体 - 通过 jquery 填充字段时客户端验证不起作用?

如何使用jQuery unobtrusive和Asp.Net Mvc验证动态生成的单选按钮组?