【发布时间】:2011-10-12 13:43:37
【问题描述】:
我正在使用 MVC3 开发一个项目。我首先创建了一个数据库(具有必要的约束,如 PK 和 FK),并使用 ADO.NET 实体数据模型将此数据库添加到我的 webappplicatie。一切似乎都很好,但我不能让验证变得灵活。这里有一些代码可以澄清我的问题。
编辑:添加了视图 + 正确的模型。此版本不导入数据库,但结果相同。
--型号----
namespace CustomValidation.Models
{
public class Person : IValidatableObject
{
public int Id { get; set; }
[Required]
public String FirstName { get; set; }
[Required]
public String LastName { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (String.IsNullOrEmpty(FirstName))
{
var field = new[] { "FirstName" };
yield return new ValidationResult("Firstname can't be null", field);
}
}
}
}
namespace CustomValidation.Models
{
public class Address : IValidatableObject
{
public int Id { get; set; }
[Required]
public String Streetname { get; set; }
[Required]
public String Zipcode { get; set; }
[Required]
public String City { get; set; }
[Required]
public String Country { get; set; }
public Person Person { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (String.IsNullOrEmpty(Streetname))
{
var field = new[] { "Streetname" };
yield return new ValidationResult("Streetname can't be null", field);
}
}
}
}
public class MasterModel
{
public List<Address> Addressess { get; set; }
public Person Person { get; set; }
}
}
namespace CustomValidation.Models
{
public class DBEntities : DbContext
{
public DbSet<Person> People { get; set; }
public DbSet<Address> Addressess { get; set; }
}
}
----控制器----
namespace CustomValidation.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
MasterModel Model = new MasterModel();
Model.Person = new Person();
Model.Addressess = new List<Address>();
Model.Addressess.Add(new Address());
Model.Addressess.Add(new Address());
return View(Model);
}
[HttpPost]
public ActionResult Index(MasterModel Model)
{
DBEntities _db = new DBEntities();
if (TryValidateModel(Model.Person))
{
_db.People.Add(Model.Person);
_db.SaveChanges();
}
else
{
return View(Model);
}
for (int i = 0; i < Model.Addressess.Count; i++)
{
if (!String.IsNullOrEmpty(Model.Addressess[i].Country))
{
if (TryValidateModel(Model.Addressess[i]))
{
Model.Addressess[i].Person = Model.Person;
_db.Addressess.Add(Model.Addressess[i]);
_db.SaveChanges();
}
else
{
return View(Model);
}
}
}
return RedirectToAction("Index");
}
}
这是我的观点:
@model CustomValidation.Models.MasterModel
@{
ViewBag.Title = "Index";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Person</legend>
<div class="editor-label">
@Html.LabelFor(m => Model.Person.FirstName)
@Html.EditorFor(m => Model.Person.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(m => Model.Person.LastName)
@Html.EditorFor(m => Model.Person.LastName)
</div>
</fieldset>
for (int i = 0; i < Model.Addressess.Count; i++)
{
<fieldset>
<legend>Address</legend>
<div class="editor-label">
@Html.LabelFor(model => Model.Addressess[i].Streetname)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Addressess[i].Streetname)
@Html.ValidationMessageFor(model => Model.Addressess[i].Streetname)
</div>
<div class="editor-label">
@Html.LabelFor(model => Model.Addressess[i].Zipcode)
</div>
<div class="editor-field">
@Html.EditorFor(model => Model.Addressess[i].Zipcode)
@Html.ValidationMessageFor(model => Model.Addressess[i].Zipcode)
</div>
<div class="editor-label">
@Html.LabelFor(model => Model.Addressess[i].City)
</div>
<div class="editor-field">
@Html.EditorFor(model => Model.Addressess[i].City)
@Html.ValidationMessageFor(model => Model.Addressess[i].City)
</div>
<div class="editor-label">
@Html.LabelFor(model => Model.Addressess[i].Country)
</div>
<div class="editor-field">
@Html.EditorFor(model => Model.Addressess[i].Country)
@Html.ValidationMessageFor(model => Model.Addressess[i].Country)
</div>
</fieldset>
}
<p>
<input type="submit" value="Create" />
</p>
}
问题(我在调试类似的东西时注意到)是在请求进入我的操作之前,MVC 首先为您的集合运行验证器。因此,如果我只在表单中填写了 Person,而在验证 Model.Person 时它只会返回 false(我猜是因为 Address 的必填字段),所以它会反弹回我的视图。
我需要一些解决方法,让我决定要在我的操作中验证我的集合的哪些实例。
在网上找了很久也没找到解决办法。
希望有人能帮帮我。
PS。我是 Visual Studio 和 MVC 3 的新手,所以请不要对我太苛刻:)
【问题讨论】:
-
我们不要认为这种观点是理所当然的。请添加您的视图,因为视图的结构会影响模型在 POST 回您的操作时的绑定方式。
-
好的,我会在几个小时后回家,然后我会(重新)准确地发布所有内容。我不认为视图会影响模型的绑定方式。
-
绑定按约定工作,扩展到视图中命名元素的约定。
-
对不起,我不明白..?顺便说一句:我已经添加了所有代码(包括视图:))
标签: visual-studio asp.net-mvc-3 entity-framework validation