我正在将现有门户网站从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数据。我该如何防止这种情况?
答案 0 :(得分:0)
将[RequiredIf(...)]
替换为普通[Required]
,然后移除@Html.HiddenFor(...)
。
这将使字段始终是必需的,用户必须提供值。
在持久保存实体之前,您必须手动验证可变所需的字段。
答案 1 :(得分:0)
您可以使用HtmlHelper.AntiForgeryToken Method 因此,您的模型将使用令牌进行验证。
另一种解决方案是手动检查是否允许用户插入数据。
在验证的边线上,您始终可以使用FluentValidation。