【问题标题】:@Html.ValidationMessageFor not preventing user from to skip Required fields@Html.ValidationMessageFor 不阻止用户跳过必填字段
【发布时间】:2020-09-20 17:57:50
【问题描述】:

我有以下代码。我也添加了用于验证字段的必要脚本文件,但验证似乎不起作用。即使用户没有提供任何输入,也可以跳过必填字段。有人可以帮忙吗?谢谢! 我在下面发布了部分代码。我的原始代码有更多的下拉菜单,并且没有一个表单验证有效。

型号:

public class User
{
  
    [Required]
    [Display(Name = "Gender")]
    public string gender { get; set; }
    
    
}


}

查看:

<body>
<div>

    <div class="card">
        <div class="row" style="padding-left:360px;">
            <p style="font-size:25px; font-weight: bold; text-align:center; padding-top: 50px; text- 
       align : center;"><u>Tell Us a Bit about Yourself! </u></p>
        </div>

        @using (Html.BeginForm("Register", "Register", FormMethod.Post, new { @class = "my_form" }))
        {
            @Html.ValidationSummary(true, "", new
               {
                   @class ="text-danger"
               })
    
        <table class="row" style="background-color:rgba(0, 0, 0, 0);">
            <tr>

                <td>
                    @Html.LabelFor(model => model.gender,
htmlAttributes: new { @class = "register.css" })

                </td>
                <td>
                    <div>
                        @Html.DropDownListFor(model => model.gender,
    new SelectList(Enum.GetValues(typeof(Gender))), "Select Gender"
    )

                        @Html.ValidationMessageFor(model =>
    model.gender, "", new { @class = "text-danger" })
                    </div>
                </td>
            </tr>
         <tr>
                <td></td>
                <td class="please-no">
                    <div>
                        <button type="submit" class="btn btn-primary" style=" 
       float:right; padding: -20px;">Next</button>
                    </div>
                </td>
            </tr>
        </table>
        }

    </div>
    <script>
@section scripts{
@Scripts.Render("~/bundles/jqueryval")

}

控制器:

    [HttpGet]
    public ActionResult Register()
    {
        return View(new User());
    }

    [HttpPost]
    public ActionResult Register(User user)
    {
        if (ModelState.IsValid)
        {
           
            return RedirectToAction("Register");
        }
        Session["user"] = user;
         return RedirectToAction("PersonalPreference", "Preference");
    }

【问题讨论】:

  • 您正在编辑的视图是_Layout.cshtml吗?我问是因为我看到了&lt;body&gt; 标记和脚本渲染。我也没有在顶部看到@model 指令,说明视图可以期望将User 的实例传递给它。如果它不是_Layout.cshtml 或自定义布局(如果您刚刚开始,这不太可能),则视图不需要定义&lt;body&gt;。如果你看一下_Layout.cshtml,它里面有一个@RenderBody() 调用。这会将控制器的输出(即 HTML、JS)注入到布局中,因此您无需在每个视图中重新定义布局。
  • @JohnH 是的,我正在使用 layout.cshtml 我的代码开头也有 User 类型的模型。对不起,我应该在问题中添加它..
  • 好的,这里有问题。通过将@model User 指令添加到您的_Layout.cshtml,这意味着您期望每个控制器操作 传递User 模型。您可以通过创建新控制器、为其创建新模型类型、添加相应视图并在其顶部指定 @model NewModel 来亲自查看这一点。如果您导航到该路线,它会抛出,因为它仍会期待 User
  • 对于您想要做的事情(即拥有一个始终可见的注册表单,无论用户浏览哪个路径),并假设 MVC 5,查看子操作如何工作,特别是使用@Html.RenderAction()@Html.RenderPartial() 在您的布局中。这将允许您将您拥有的代码移动到一个单独的 .cshtml 中,该 .cshtml 需要您的 User,同时您可以使用其他模型让其他路线工作。

标签: asp.net asp.net-mvc validation model-view-controller


【解决方案1】:

我终于找到了解决办法。不得不添加以下脚本文件。谢谢大家的时间!

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js"></script>
<script 
src="https://cdnjs.cloudflare.com/ajax/libs/jqueryvalidate/1.19.1/jquery.validate.js"> 
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation- 
unobtrusive/3.2.11/jquery.validate.unobtrusive.js"></script>

【讨论】:

  • 感谢您发布您的解决方案,但请在某个时候阅读我的 cmets。
  • @JohnH 非常感谢您的解释!我对此一无所知。但是,我的网站非常小,我的控制器中只有一个操作,所以它现在对我有用。但我一定会记住它以备将来使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
相关资源
最近更新 更多