我的Client类现在工作正常,并且定义为
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
定义的这是我添加的两个新编辑器: 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)
因此,正如您所看到的,视图的代码现在非常紧凑。
然而,在所有这些措施到位的情况下,验证不再适用。我曾经通过键入一些垃圾来测试电子邮件上的验证。它用于在文本框附近提供验证消息。现在我发现电子邮件文本框采用红色边框,但没有消息。
你看到我现在缺少什么,是否可以使用复杂的类型和验证?
为了澄清,从此客户端视图调用_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 :(得分:1)
我在您的网页上看不到任何表单。验证工作需要表单上下文。您需要在BeginForm块中包装Editor属性。
答案 1 :(得分: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>
验证消息不再显示。
希望这个答案可以帮助某人,或者你可能会看到我在这里缺少的东西。