MVC验证万无一失

时间:2012-11-15 23:34:40

标签: c# asp.net-mvc validation

我正在将现有门户网站从Web表单重新转换为MVC,我在验证时遇到问题。我有类似这种模式的东西:

public class Customer
{
    [RequiredIf("FirstNameRequired", true)]        
    [Display(Name = "First Name")]
    public string FirstName { get; set; }
    public bool FirstNameRequired { get; set; }
    public bool FirstNameVisible { get; set; }

    [RequiredIf("LastNameRequired", true)]
    public string LastName { get; set; }
    public bool LastNameRequired { get; set; }
    public bool LastNameVisible { get; set; }

    [RequiredIf("EmailRequired", true)]
    public string Email { get; set; }
    public bool EmailRequired { get; set; }
    public bool EmailVisible { get; set; }
}

public class PersonalInfo
{
    public Customer PrimaryCustomer { get; set; }
    public IEnumerable<Customer> Customers { get; set; }
}

客户中有很多属性,但我只添加了3个(例如100或者其他)。 我这样做是因为有很多接触类型和属性,如可见和必需的dinamyc。现在我有了一个可以呈现所有客户的编辑器模板。它就是这样的。

@if (Model.FirstNameVisible)
{ 
    <p>
        First Name:
        @Html.TextBoxFor(x => x.FirstName)
    </p>
}
@if (Model.LastNameVisible)
{ 
    <p>
        Last Name:
        @Html.TextBoxFor(x => x.LastName)
    </p>
}
@if (Model.EmailVisible)
{ 
    <p>
        Email:
        @Html.TextBoxFor(x => x.Email)
    </p>
}

现在这是渲染所有联系人,但是当我在模型中发布数据时,REQUIRED和VISIBLE布尔属性为false。这是因为我没有添加:

@Html.HiddenFor(x => x.FirstNameRequired)
@Html.HiddenFor(x => x.FirstNameVisible)

如果我添加此验证工作正常。 ModelState.IsValid正在进行核心工作。 问题是如果有人更改隐藏的价值数据并且能够插入incorect数据。我该如何防止这种情况?

2 个答案:

答案 0 :(得分:0)

[RequiredIf(...)]替换为普通[Required],然后移除@Html.HiddenFor(...)。 这将使字段始终是必需的,用户必须提供值。

在持久保存实体之前,您必须手动验证可变所需的字段。

答案 1 :(得分:0)

您可以使用HtmlHelper.AntiForgeryToken Method 因此,您的模型将使用令牌进行验证。

另一种解决方案是手动检查是否允许用户插入数据。

在验证的边线上,您始终可以使用FluentValidation