在ASP.NET MVC应用程序中应在哪里验证我的数据?

时间:2018-10-12 17:37:52

标签: 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" })

我的问题是...最好是仅在模型中或在视图本身中进行验证?在维护安全性方面,更安全的是什么?

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

谢谢

1 个答案:

答案 0 :(得分:4)

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

public string Name { get; set; }

然后什么也不会产生。但是,如果您有这样的话:

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

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

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