我认为我作弊了,但我刚刚创建了一个新的 GUID 字段模板。
使用为您的类创建扩展元数据。此处显示的缩短版本。并将其与您的班级相关联。
然后将 GUID.ascx 和 GUID_Edit.ascx 添加到您的项目中。当您插入新记录时,将生成一个 GUID,并以只读方式显示在您的表单中。关键是使 UIHint 成为 GUID 类型。
代码如下...
--- EventCalendarMetadata.cs
namespace DFEventsWeb
{
[MetadataType( typeof ( EventCalendar_Metadata ) ) ]
public partial class EVENT_CALENDAR
{
[DisplayName("EVENTS")]
private abstract class EventCalendar_Metadata
{
[Display(Name = "ID")]
[UIHint("GUID")]
public object EVENT_ID { get; set; }
.... other fields removed ...
}
}
}
--- GUID.ascx
<%@ Control Language="C#" CodeBehind="GUID.ascx.cs" Inherits="DFEventsWeb.GUID" %>
<asp:Literal runat="server" ID="Literal1" Text="<%# FieldValueString %>" />
--- GUID.ascx.cs
命名空间 DFEventsWeb
{
public partial class GUID : System.Web.DynamicData.FieldTemplateUserControl
{
private const int MAX_DISPLAYLENGTH_IN_LIST = 100;
public override string FieldValueString
{
get
{
string value = base.FieldValueString;
if (ContainerType == ContainerType.List)
{
if (value != null && value.Length > MAX_DISPLAYLENGTH_IN_LIST)
{
value = value.Substring(0, MAX_DISPLAYLENGTH_IN_LIST - 3) + "...";
}
}
return value;
}
}
public override Control DataControl
{
get
{
return Literal1;
}
}
}
}
--- GUID_Edit.ascx
<%@ Control Language="C#" CodeBehind="GUID_Edit.ascx.cs" Inherits="DFEventsWeb.GUID_EditField" %>
<asp:Literal ID="Literal1" runat="server" Text='<%# OVERRIDE_GUID %>'></asp:Literal>
--- GUID_Edit.ascx.cs
namespace DFEventsWeb
{
public partial class GUID_EditField : System.Web.DynamicData.FieldTemplateUserControl
{
const int MAX_TEXT_COLUMN_SIZE = 200; // jeh
string m_GUIDString;
public string OVERRIDE_GUID
{
get { return m_GUIDString; }
set { m_GUIDString = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected override void OnDataBinding(EventArgs e)
{
base.OnDataBinding(e);
OVERRIDE_GUID = ( FieldValueEditString.Length <= 0 ? System.Guid.NewGuid().ToString() : FieldValueEditString );
}
protected override void ExtractValues(IOrderedDictionary dictionary)
{
dictionary[Column.Name] = ConvertEditedValue(Literal1.Text);
}
public override Control DataControl
{
get
{
return Literal1;
}
}
}
}