【问题标题】:Where should my data be validated in my ASP.NET MVC app? [duplicate]我的数据应该在我的 ASP.NET MVC 应用程序中的什么位置进行验证? [复制]
【发布时间】:2019-03-17 23:33:02
【问题描述】:

我不想要意见。我想在下面回答这个问题。 我知道在我的模型类中,我可以包含数据注释来验证我的表单:

public class Movie
{
    public int Id { get; set; }
    public string Title { get; set; }

    [Display(Name = "Release Date")]
    [DataType(DataType.Date)]
    [DisplayFormat(ApplyFormatInEditMode =true, DataFormatString = "{0:yyy-MM-dd}")]
    public DateTime ReleaseDate { get; set; }

    public string Genre { get; set; }

    [DataType(DataType.Currency)]
    public decimal Price { get; set; }

}

但是,已经有 JavaScript 库可以验证默认行为(即@Html.ValidationMessageFor()):

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

我的问题是......最佳实践是仅在模型中验证还是在视图本身中验证?在维护安全方面什么更安全?

如果这是一个错误的问题,请告诉我,我会尽快删除它。

谢谢

【问题讨论】:

  • 模型验证在服务器端,JavaScript 验证在客户端。

标签: javascript c# asp.net-mvc validation


【解决方案1】:

Html.ValidationMessageFor 将根据模型中的属性生成所需的 HTML。因此,如果您的模型具有这样的属性:

public string Name { get; set; }

然后什么都不会生成。但是,如果你有这个:

[Required]
public string Name { get; set; }

然后生成的 HTML 将包含此字段为必填项的信息。因此,您将获得 JavaScript 支持,以确保用户在提交表单之前填写该字段。换句话说,仅仅因为你有Html.ValidationMessageFor 并不意味着你得到了验证。您仍然需要模型上的数据注释来帮助视图引擎生成 HTML 属性,例如 required="required" 等。

使用 JavaScript 在客户端进行验证是为了方便和更好的用户体验。但是,即使您已经在客户端验证了数据,您也应该始终在服务器上进行验证。不要相信客户。此外,在某些情况下,JavaScript 可能会被禁用,因此您的 JavaScript 验证可能永远不会被触发,因此,您应该始终在服务器端执行验证的另一个原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2017-07-09
    相关资源
    最近更新 更多