Проверки не отображаются с использованием EF Code First со сложными типами
Это продолжение этого вопросаМодель класса и картография
У меня был класс клиента, теперь он работает нормально, и этоопределяется как
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
using DataAnnotationsExtensions;
using System.ComponentModel.DataAnnotations.Schema;
using System.Collections.Generic;
namespace CardNumbers.Objects
{
[ComplexType]
public class PhoneInfo
{
[DataType(DataType.PhoneNumber)]
[StringLength(10)]
[DisplayName("Phone")]
public virtual string Phone { get; set; }
[StringLength(5)]
[DisplayName("Ext")]
public virtual string Ext { get; set; }
public bool HasValue
{
get
{
return (Phone != null || Ext != null);
}
}
}
[ComplexType]
public class ContactDetail
{
//Constructor
public ContactDetail()
{
phoneInfo = new PhoneInfo();
}
[StringLength(100)]
[DisplayName("Contact Name")]
[DisplayFormat(NullDisplayText = "")]
public virtual string Contact { get; set; }
[Email]
[StringLength(100)]
[DisplayName("Email")]
public virtual string Email { get; set; }
public virtual PhoneInfo phoneInfo { get; set; }
public bool HasValue
{
get
{
return (Contact != null || Email != null || phoneInfo.HasValue);
}
}
}
///
/// Client class (Client No, Client Name, Address, Contact1, Contact2 info, Created By, Modified By (operator and date)
///
public class Client
{
public Client()
{
Contact1 = new ContactDetail();
Contact2 = new ContactDetail();
}
[Key]
[Column("ClientId",TypeName = "int")]
public virtual int Id { get; set; }
[Required]
[DisplayName("Client No")]
[Column("client_no", TypeName = "smallint")]
public virtual Int16 Number { get; set; }
[Required]
[Column("client_name", TypeName = "varchar")]
[DisplayName("Client Name")]
[MaxLength(30, ErrorMessage = "Client Name should not be longer than 30 characters" )]
[MinLength(3, ErrorMessage = "Client Name is too short")]
public virtual string Name { get; set; }
[DataType(DataType.MultilineText)]
public virtual string Address { get; set; }
public virtual ContactDetail Contact1 {get; set;}
public virtual ContactDetail Contact2 {get; set;}
[ForeignKey("EnteredByOperator")]
public string EnteredBy { get; set; }
[InverseProperty("ClientsEnteredBy")]
public virtual Operator EnteredByOperator { get; set; }
[ForeignKey("ModifiedByOperator")]
public string ModifiedBy { get; set; }
[InverseProperty("ClientsUpdatedBy")]
public virtual Operator ModifiedByOperator { get; set; }
[DataType(DataType.DateTime)]
[DisplayName("Created on")]
public DateTime EnteredOn { get; set; }
[DataType(DataType.DateTime)]
[DisplayName("Modified on")]
public DateTime? ModifiedOn { get; set; }
public virtual ICollection ClientOrders { get; set; }
public virtual ICollection Reorders { get; set; }
}
}
Я сопоставил имена столбцов с помощью Fluent API, и я также переопределил свой оригинал "хранилище» классы должны быть очень похожи на определенные в этом урокеhttp://code.msdn.microsoft.com/ASPNET-MVC-Application-b01a9fe8
Это мое текущее частичное представление для клиентской формы с именем _ClientForm:
@using WebDemo.Helper
@model CardNumbers.Objects.Client
Client Info
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.Id)
@Html.EditorFor(model => model.Number, EditorTemplate.TextBox)
@Html.EditorFor(model => model.Name, EditorTemplate.TextBox)
@Html.EditorFor(model => model.Address, EditorTemplate.EditBox)
@*Contact 1*@
@*@Html.EditorFor(model=>model.Contact1)*@
@Html.EditorFor(model=>model.Contact1.Contact, EditorTemplate.TextBox)
@Html.EditorFor(model=>model.Contact1.Email, EditorTemplate.TextBox)
@*Contact2*@
@* @Html.EditorFor(model => model.Contact2)*@
@**@
Save
Cancel
Я уже пытался вернуться к первоначальному способу только одного уровня, и я также прокомментировал вторую информацию о Contact2, но проверка электронной почты все еще нене работают и все другие проверки также неКажется, не работает.
Текстовые поля EditorFor определены на основе этого сообщения в блоге.http://fusionovation.com/post/2010/02/15/adding-a-rich-text-editor-to-asp-net-mvc-using-strongly-typed-helpers-dataannotations-amp-jquery.aspx
И это два новых редактора, которые я добавил: PhoneInfo.cshtml
@using WebDemo.Helper
@model CardNumbers.Objects.PhoneInfo
@Html.EditorFor(model => model.Phone, EditorTemplate.TextBox)
@Html.EditorFor(model => model.Ext, EditorTemplate.TextBox)
И ContactDetail.cshtml
@using WebDemo.Helper
@model CardNumbers.Objects.ContactDetail
@Html.EditorFor(model => model.Contact, EditorTemplate.TextBox)
@Html.EditorFor(model => model.Email, EditorTemplate.TextBox)
@Html.EditorFor(model=>model.phoneInfo)
Итак, как вы можете видеть, код представлений теперь очень компактен.
Тем не менее, с учетом всего этого, проверки небольше не вижу огня. Я использовал для проверки валидации на EMail, набирая мусор. Используется для предоставления сообщения проверки рядом с текстовым полем. Сейчас я наблюдаю, что текстовое поле электронной почты принимает красную рамку, но сообщения нет.
Вы видите, чего мне не хватает сейчас и если этоМожно ли использовать сложный тип и проверки?
Чтобы уточнить, _ClientForm вызывается из этого представления клиента:
@model CardNumbers.Objects.Client
@{
ViewBag.Title = "Client";
}
@section scripts {
}
Client No:
<br>
Client Name:
@{Html.RenderPartial("_ClientForm", Model) ;}
Благодарю.