2012-10-22 19 views
0

这是这个问题Model class and Mapping验证显示不出来使用EF代码第一次与复杂类型

的延续,我有我的客户端类现在工作正常,它的定义为

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); 
       } 
      } 
     } 

/// <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] 
     [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; } 
    } 
} 

我使用映射列名Fluent API和我还重新定义了我的原始“存储库”类,与本教程中定义的非常相似http://code.msdn.microsoft.com/ASPNET-MVC-Application-b01a9fe8

这是我当前对称为_ClientForm的客户端窗体的部分视图:

@using WebDemo.Helper 
@model CardNumbers.Objects.Client 
<fieldset> 
    <legend>Client Info</legend> 

    @Html.ValidationSummary(true) 

    <input type="hidden" id="fntype" name="fntype"> 
    @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) 

    <div id="ContactsInfo"> 
     @*Contact 1*@ 

     <div id="Contact1"> 

     @*@Html.EditorFor(model=>model.Contact1)*@ 
      @Html.EditorFor(model=>model.Contact1.Contact, EditorTemplate.TextBox) 
      @Html.EditorFor(model=>model.Contact1.Email, EditorTemplate.TextBox) 
     </div> 

     @*Contact2*@ 
     <div id="Contact2"> 

     @* @Html.EditorFor(model => model.Contact2)*@ 
     </div> 
    </div> 
    @*<div class="clear"></div>*@ 
    <div id="SaveCancel" class="float-right"> 
     <button type="Submit" id="btnSave">Save</button> 
     <button type="reset" id="btnCancel">Cancel</button> 
    </div> 
</fieldset> 

我已经尝试恢复到原始的方式只有一个级别的,我还评论了第二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

这是两件新EditorFor我说的: PhoneInfo.cshtml

@using WebDemo.Helper 
@model CardNumbers.Objects.PhoneInfo 

<div id="PhoneInfo"> 
    <div class="float-left"> 
     @Html.EditorFor(model => model.Phone, EditorTemplate.TextBox) 
    </div> 
    <div class="float-right"> 
     @Html.EditorFor(model => model.Ext, EditorTemplate.TextBox) 
    </div> 
</div> 

而且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 { 
    <script src="@Url.Content("~/Scripts/Clients.js")" type="text/javascript" ></script> 
} 

<form id="frmClientsSearch"> 
     <label for="clientNo">Client No: </label> 
     <input type="number" name="searchClientNo" class="numericOnly" /><br /> 
     <label for="clientName">Client Name: </label> 
     <input type = "text" size =25 value ="Please enter the search value" class="SelectOnEntry" 
      name ="searchClientName" /> 

     <input type="button" id="btnClientsSearch" value ="Find/Refresh" />  
</form> 
<div style="padding-left: 150px; padding-top: 50px; padding-bottom: 50px;" id="ClientsResults"> 
    <table id="flexClients" style="display: none"> 
    </table> 
</div> 
<div style="display: none"> 
    <form id="sform" title="Client Info"> 


     @{Html.RenderPartial("_ClientForm", Model) ;} 

    </form> 
</div> 

感谢。

+0

您可以添加您的实际EditorFor模板,您链接到的似乎不包括验证。 – Betty

回答

0

经过一些试验和错误,我发现TextBox EditorFor视图是罪魁祸首。我记录我在我的答案在这里找到http://forums.asp.net/t/1855963.aspx/1?Validation+messages+don+t+show+up+what+is+missing+

基本上,只要我用这个EditorFor

@*@using WebDemo.Helper*@ 
@model CardNumbers.Objects.PhoneInfo 

<div id="PhoneInfo"> 
    <div class="float-left"> 
     @* @Html.EditorFor(model => model.Phone, EditorTemplate.TextBox)*@ 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Phone) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Phone) 
      @Html.ValidationMessageFor(model => model.Phone) 
     </div> 
    </div> 
    <div class="float-right"> 
     @*@Html.EditorFor(model => model.Ext, EditorTemplate.TextBox)*@ 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.Ext) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Ext) 
      @Html.ValidationMessageFor(model => model.Ext) 
     </div> 
    </div> 
</div> 

一切似乎工作确定。但是,如果我尝试切换到较短的语法并使用此EditorFor作为文本框:

<div class="editor-label"> 
    @Html.Label((ViewData.ModelMetadata.DisplayName??ViewData.ModelMetadata.PropertyName), 
     new Dictionary<string, object> 
      { 
       { "for", ViewData.ModelMetadata.PropertyName } 
      }) 
</div> 
<div class="editor-field"> 
    @Html.TextBox("", (object)Model, 
     new Dictionary<string, object> 
      { 
       { "id", ViewData.ModelMetadata.PropertyName }, 
       { "name", ViewData.ModelMetadata.PropertyName }, 
       { "class", "text-box single-line"}, 
       { "data-bind", "value: " + ViewData.ModelMetadata.PropertyName }, 
      }) 
    @Html.ValidationMessage(ViewData.ModelMetadata.PropertyName, 
     new Dictionary<string, object> 
      { 
       { "data-valmsg-for", ViewData.ModelMetadata.PropertyName } 
      }) 
</div> 

验证消息不再显示。

希望这个答案会帮助别人,或者你可能会看到我在这里失踪的东西。

1

我没有在您的页面上的任何地方看到表格。验证工作需要表单上下文。您需要将编辑器属性包装在BeginForm块中。

+0

实际上,这个_ClientForm是从这个视图中调用的(参见更新后的问题)。你认为这仍然是一个问题? – Naomi

+0

@Naomi - 所以你有一种什么都不做的形式?您没有操作端口方法属性。您无法提交表单时,您究竟如何验证结果? –

+0

即使没有提交,它仍然可以工作,例如我离开电子邮件后立即看到验证信息。现在我只看到正确的边界,但没有消息。我将稍微重新设计基于此http://www.ienablemuch.com/2011/11/flexigrid-crudinline-form-with-aspnet.html – Naomi