javascript - 我的数据应该在 ASP.NET MVC 应用程序中的何处进行验证?

标签 javascript c# asp.net-mvc validation

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

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" })

我的问题是...最好的做法是仅在模型中验证还是在 View 本身中验证?在维护安全方面什么更安全?

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

谢谢

最佳答案

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

public string Name { get; set; }

那么什么也不会生成。但是,如果你有这个:

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

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

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

关于javascript - 我的数据应该在 ASP.NET MVC 应用程序中的何处进行验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52784544/

相关文章:

php - 使用 HTML 和 PHP 更新值而无需重新加载

javascript - 仅使用 Javascript 从 API 获取数据

c# - 委托(delegate):Predicate vs. Action vs. Func

asp.net-mvc - 将新属性添加到 MVC ModelMetadata

asp.net-mvc - ASP MVC 以 JSON 格式查看内容

asp.net-mvc - ASP.NET MVC 为何如此 RESTful?

javascript - 如何将单元格颜色设置为具有动态列的网格?

javascript - 如何使用按钮调用 Javascript

c# - SciChart 具有最小轴范围的实时缩放

c# - 为什么不指定“ref”就可以从方法更改Struct的int []属性?