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)] [DisplayName("Phone")] [RegularExpression(@"^((\(\d{3}\)|\d{3})\s?)?\d{3}[-\s]?\d{4}\s*$", ErrorMessage = "Please enter valid Phone Number")] 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)] [DataType(DataType.EmailAddress)] [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); } } } /// <summary> /// Client class (Client No, Client Name, Address, Contact1, Contact2 info, Created By, Modified By (operator and date) /// </summary> public class Client { public Client() { Contact1 = new ContactDetail(); Contact2 = new ContactDetail(); } [Key] [Editable(false)] [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<ClientOrder> ClientOrders { get; set; } public virtual ICollection<Reorder> Reorders { get; set; } } }And this is what I see when I view source of that form:
<div id="editor" style="visibility:hidden"> <form action="/Client/Client" id="sform" method="post" title="Client Info"> <fieldset> <legend>Client Info</legend> <input data-val="true" data-val-number="The field ClientId must be a number." id="ClientId" name="ClientId" type="hidden" value="" /> <div class="editor-label"> <label for="Number">Client No</label> </div> <div class="editor-field"> <input class="numericOnly" data-val="true" data-val-number="The field Client No must be a number." data-val-remote="Client Number already exists. Please enter a different Client Number." data-val-remote-additionalfields="*.Number,*.ClientId" data-val-remote-type="POST" data-val-remote-url="/Client/doesClientNoExist" data-val-required="The Client No field is required." id="Number" name="Number" type="number" value="" /> <span class="field-validation-valid" data-valmsg-for="Number" data-valmsg-replace="true"></span> </div> <div class="editor-label"> <label for="Name">Client Name</label> </div> <div class="editor-field"> <input class="text-box single-line" data-bind="value: Name" data-val="true" data-val-remote="Client Name already exists. Please enter a different Client Name." data-val-remote-additionalfields="*.Name,*.ClientId" data-val-remote-type="POST" data-val-remote-url="/Client/doesClientNameExist" data-val-required="The Client Name field is required." id="Name" name="Name" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span> </div> <div class="editor-label"> <label for="Address">Address</label> </div> <div class="editor-field"> <textarea class="text-box multi-line" cols="60" data-bind="value: Address" id="Address" name="Client.Address" rows="5" wrap="virtual"> </textarea> <span class="field-validation-valid" data-valmsg-for="Address" data-valmsg-replace="true"></span> </div> <div id="ContactsInfo"> <div id="Contact1"> <div class="editor-label"> <label for="Client_Contact1_Contact">Contact Name</label> </div> <div class="editor-field"> <input class="text-box single-line" data-val="true" data-val-length="The field Contact Name must be a string with a maximum length of 100." data-val-length-max="100" id="Client_Contact1_Contact" name="Client.Contact1.Contact" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="Client.Contact1.Contact" data-valmsg-replace="true"></span> </div> <div class="editor-label"> <label for="Client_Contact1_Email">Email</label> </div> <div class="editor-field"> <input class="text-box single-line" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-length="The field Email must be a string with a maximum length of 100." data-val-length-max="100" id="Client_Contact1_Email" name="Client.Contact1.Email" type="email" value="" /> <span class="field-validation-valid" data-valmsg-for="Client.Contact1.Email" data-valmsg-replace="true"></span> </div> <div id="PhoneInfo"> <div class="float-left"> <div class="editor-label"> <label for="Client_Contact1_phoneInfo_Phone">Phone</label> </div> <div class="editor-field"> <input class="text-box single-line" data-val="true" data-val-regex="Please enter valid Phone Number" data-val-regex-pattern="^((\(\d{3}\)|\d{3})\s?)?\d{3}[-\s]?\d{4}\s*$" id="Client_Contact1_phoneInfo_Phone" name="Client.Contact1.phoneInfo.Phone" type="tel" value="" /> <span class="field-validation-valid" data-valmsg-for="Client.Contact1.phoneInfo.Phone" data-valmsg-replace="true"></span> </div> </div> <div class="float-right"> <div class="editor-label"> <label for="Client_Contact1_phoneInfo_Ext">Ext</label> </div> <div class="editor-field"> <input class="text-box single-line" data-val="true" data-val-length="The field Ext must be a string with a maximum length of 5." data-val-length-max="5" id="Client_Contact1_phoneInfo_Ext" name="Client.Contact1.phoneInfo.Ext" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="Client.Contact1.phoneInfo.Ext" data-valmsg-replace="true"></span> </div> </div> </div> </div> <div id="Contact2"> <div class="editor-label"> <label for="Client_Contact2_Contact">Contact Name</label> </div> <div class="editor-field"> <input class="text-box single-line" data-val="true" data-val-length="The field Contact Name must be a string with a maximum length of 100." data-val-length-max="100" id="Client_Contact2_Contact" name="Client.Contact2.Contact" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="Client.Contact2.Contact" data-valmsg-replace="true"></span> </div> <div class="editor-label"> <label for="Client_Contact2_Email">Email</label> </div> <div class="editor-field"> <input class="text-box single-line" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-length="The field Email must be a string with a maximum length of 100." data-val-length-max="100" id="Client_Contact2_Email" name="Client.Contact2.Email" type="email" value="" /> <span class="field-validation-valid" data-valmsg-for="Client.Contact2.Email" data-valmsg-replace="true"></span> </div> <div id="PhoneInfo"> <div class="float-left"> <div class="editor-label"> <label for="Client_Contact2_phoneInfo_Phone">Phone</label> </div> <div class="editor-field"> <input class="text-box single-line" data-val="true" data-val-regex="Please enter valid Phone Number" data-val-regex-pattern="^((\(\d{3}\)|\d{3})\s?)?\d{3}[-\s]?\d{4}\s*$" id="Client_Contact2_phoneInfo_Phone" name="Client.Contact2.phoneInfo.Phone" type="tel" value="" /> <span class="field-validation-valid" data-valmsg-for="Client.Contact2.phoneInfo.Phone" data-valmsg-replace="true"></span> </div> </div> <div class="float-right"> <div class="editor-label"> <label for="Client_Contact2_phoneInfo_Ext">Ext</label> </div> <div class="editor-field"> <input class="text-box single-line" data-val="true" data-val-length="The field Ext must be a string with a maximum length of 5." data-val-length-max="5" id="Client_Contact2_phoneInfo_Ext" name="Client.Contact2.phoneInfo.Ext" type="text" value="" /> <span class="field-validation-valid" data-valmsg-for="Client.Contact2.phoneInfo.Ext" data-valmsg-replace="true"></span> </div> </div> </div> </div> </div> <div id="SaveCancel" class="float-right"> <button id="btnSave">Save</button> <button type="reset" id ="btnCancel" name="Reset">Cancel</button> </div> </fieldset> </form>; </div>In Opera browser (actually, I only show relevant portion of view source, the view shows everything including menu, grid, and footer).