【问题标题】:Client side validation doesn't work in ASP.NET Core MVC app客户端验证在 ASP.NET Core MVC 应用程序中不起作用
【发布时间】:2018-04-09 10:11:09
【问题描述】:

我有一个登录页面,它具有以下模型:

public class LoginViewModel : BaseViewModel
{
    public LoginFormViewModel Form { get; set; }
}
public class LoginFormViewModel
{
    [Required]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Required]
    public bool RememberMe { get; set; }
}

这是页面html:

@model SocialNetwork.Web.ViewModels.LoginViewModel

@section scripts {
    <script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
    <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
}

<h2>Login</h2>

<style>
    #btn-login {
        float: left;
        margin-left: 14px;
    }

    #checkbox-remember-me {
        margin-right: 15px;
    }
</style>

<div class="col-md-offset-2 col-md-4">
    <form asp-action="Login">
        <div class="row">
            <div>
                <div class="form-group col-md-12">
                    <label asp-for="Form.UserName"></label>
                    <input asp-for="Form.UserName" name="UserName" class="form-control">
                    <span asp-validation-for="Form.UserName"></span>
                </div>
            </div>
        </div>
        <div class="row">
            <div>
                <div class="form-group col-md-12">
                    <label asp-for="Form.Password"></label>
                    <input asp-for="Form.Password" name="Password" class="form-control">
                    <span asp-validation-for="Form.Password"></span>
                </div>
            </div>
        </div>
        <div asp-validation-summary="All"></div>
        <div class="row">
            <div class="checkbox pull-right" id="checkbox-remember-me">
                <label>
                    <input asp-for="Form.RememberMe" name="RememberMe">
                    Remember me
                </label>
            </div>
            <button type="submit" id="btn-login" class="btn btn btn-primary">
                Log In
            </button>
        </div>
    </form>
</div>

客户端验证根本不起作用,那些&lt;span asp-validation-for="some-property"&gt;&lt;/span&gt; 根本不起作用;但是&lt;div asp-validation-summary="All"&gt;&lt;/div&gt; 会,当然,当页面刷新时。

我几乎没有更改 _Layout.cshtml 中的任何内容。我确信 Login.cshtml 顶部的那些脚本在该文件夹中,并且它们被包含在内。

控制器中的表单操作将 LoginFormViewModel 作为参数,一切正常。

我已经覆盖了名称,否则,表单在提交表单时不会绑定到它的模型。 Model.Form.Password 的名称是 Form_Password,它无法在提交时将其映射到模型中,因为在模型中它被称为密码。 所以,我想这一定是个问题,所以必须有另一种方法在提交时将该表单映射到其模型,对吧?

【问题讨论】:

  • 因为您使用name="..." 覆盖name 属性,所以在任何情况下都不要尝试在使用TagHelpers 时更改name 属性
  • 您为什么要对Form 属性使用两步设计?这似乎毫无意义,而且您确实会引发各种映射问题。

标签: asp.net-mvc asp.net-core-mvc asp.net-core-2.0


【解决方案1】:

不确定您从哪里获得 Form.Property,但这是它应该工作的方式

但模型应该看起来像

public class LoginViewModel : BaseViewModel
{    
    [Required]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Required]
    public bool RememberMe { get; set; }
}

以及相关的html

<form asp-route-returnurl="@ViewData["ReturnUrl"]" method="post">
            <h4>Use a local account to log in.</h4>
            <hr />
            <div asp-validation-summary="All" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="UseName"></label>
                <input asp-for="UserName" class="form-control" />
                <span asp-validation-for="UserName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Password"></label>
                <input asp-for="Password" class="form-control" />
                <span asp-validation-for="Password" class="text-danger"></span>
            </div>
            <div class="form-group">
                <div class="checkbox">
                    <label asp-for="RememberMe">
                        <input asp-for="RememberMe" />
                        @Html.DisplayNameFor(m => m.RememberMe)
                    </label>
                </div>
            </div>
            <div class="form-group">
                <button type="submit" class="btn btn-default">Log in</button>
            </div>

        </form>

asp-tag 助手使用您在视图中使用的模型的属性..

【讨论】:

  • 它不起作用,因为属性 Email 和 Pasword 不在模型的根目录中,而是在它的 Form 属性中。
  • 已编辑...没有注意到 OP 顶部的模型
  • 但我不想那样做,我希望表单嵌套在模型中
  • @Scarass...为什么,这样做可能有什么好处?你打破了 KISS 成语。
  • 因为它属于名为Form的嵌套属性,因为它不是整个页面的数据,而只是表单的数据。控制器操作应该只采用这种形式,而不是整个视图模型。
【解决方案2】:

请务必添加

app.UseStaticFiles(); //in Configure() method of StartUp.cs class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 2014-03-25
    • 2011-12-19
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多