我是MVC的新手,我仍然在努力解决我认为非常基本的mvc问题。我的目的只是渲染表示数据对象集合的文本框,以便我可以使用DataAnnoations轻松验证它们。我已阅读并理解本教程,并且已经让它工作得很好 - 但它只能一次验证一个人对象,由原语组成:
http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx
我的问题与这篇文章类似,但是我没有成功将它应用到没有剃刀的情况中:
MVC 3 client-side validation on collection with data annotations -- not working
验证在String和int之类的“原语”上很有用,但我不理解对集合的验证。
这是代表我的对象的一个实例和一些验证的类:
public class vc_EBTOCRecord
{
[StringLength(10, ErrorMessage = "must be under 10 chars")]
[Required(ErrorMessage = "Problem!")]
public String ItemText;
}
以下是视图继承的模型:
public class EBTOCViewModel
{
public List<vc_EBTOCRecord> VcEbtocRecordList { get; set; }
}
这是我的控制器:
public ActionResult Create()
{
EBTOCViewModel ebtocViewModel = new EBTOCViewModel();
List<vc_EBTOCRecord> vcEbtocRecordList = new List<vc_EBTOCRecord>();
vc_EBTOCRecord vcEbtocRecord = new vc_EBTOCRecord();
vcEbtocRecord.ItemText = "bob";
vcEbtocRecordList.Add(vcEbtocRecord);
vc_EBTOCRecord vcEbtocRecord2 = new vc_EBTOCRecord();
vcEbtocRecord.ItemText = "fred";
vcEbtocRecordList.Add(vcEbtocRecord2);
vc_EBTOCRecord vcEbtocRecord3 = new vc_EBTOCRecord();
vcEbtocRecord.ItemText = "joe";
vcEbtocRecordList.Add(vcEbtocRecord3);
ebtocViewModel.VcEbtocRecordList = vcEbtocRecordList;
return View(ebtocViewModel);
}
最后,这是我在我看来尝试的内容:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<vcAdminTool.ViewModels.EBTOCViewModel>" %>
<h2>Create</h2>
<% using (Html.BeginForm()) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<% foreach(var thing in Model.VcEbtocRecordList)
{
Html.TextBoxFor(model => thing.ItemText);
//Html.TextBox("hello", thing.ItemText ); didn't work...
//Html.TextBox("hello"); nope, still didn't work
Response.Write("a record is here");
}
%>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
<div>
<%: Html.ActionLink("Back to List", "Index") %>
</div>
当视图呈现时,“一条记录就在这里”被打印三次,向我表明MVC识别出我创建的底层对象,但为什么不渲染三个文本框呢?
所需的结果是有三个空白的验证文本框。然后,如果表单有效,我将编写将信息写回数据库的代码。
如果你愿意,我错过了哪些明显的东西?