I have created a custom dynamic data field template to display a drop down list of states. The drop down appears no problem. But it is not displaying as 'Required'. Meaning if I leave it blank, I can still move on to the next page. Other fields on the page do validate correctly.
HTML of the field template
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="State_Edit.ascx.vb" Inherits="State_EditField" %>
<asp:ObjectDataSource ID="objectDataSourceState" runat="server" SelectMethod="GetAll" DataObjectTypeName="AsbestosEntities.lu_state"
TypeName="AsbestosBusiness.StateController">
</asp:ObjectDataSource>
<asp:DropDownList ID="DropDownList1" runat="server" CssClass="ui-corner-all ui-widget input-text" AppendDataBoundItems="true" DataSourceID="objectDataSourceState" DataTextField="description" DataValueField="code">
<asp:ListItem Value="-1" Text=""></asp:ListItem>
</asp:DropDownList>
<asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator1" CssClass="validator" ControlToValidate="DropDownList1" Display="Static" Enabled="false" InitialValue="-1" />
<asp:DynamicValidator runat="server" ID="DynamicValidator1" CssClass="validator" ControlToValidate="DropDownList1" Display="Static" />
Code Behind of the field template
Imports System.ComponentModel.DataAnnotations
Imports System.Web.DynamicData
Imports System.Web
Class State_EditField
Inherits FieldTemplateUserControl
Public Overrides ReadOnly Property DataControl As Control
Get
Return DropDownList1
End Get
End Property
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
If (DropDownList1.Items.Count = 0) Then
If Mode = DataBoundControlMode.Insert OrElse Not Column.IsRequired Then
DropDownList1.Items.Add(New ListItem("[Not Set]", ""))
End If
PopulateListControl(DropDownList1)
End If
SetUpValidator(RequiredFieldValidator1)
SetUpValidator(DynamicValidator1)
End Sub
Protected Overrides Sub OnDataBinding(ByVal e As EventArgs)
MyBase.OnDataBinding(e)
Dim selectedValueString As String = GetSelectedValueString()
Dim item As ListItem = DropDownList1.Items.FindByValue(selectedValueString)
If item IsNot Nothing Then
DropDownList1.SelectedValue = selectedValueString
End If
End Sub
Protected Overrides Sub ExtractValues(ByVal dictionary As IOrderedDictionary)
' If it's an empty string, change it to null
Dim value As String = DropDownList1.SelectedValue
If String.IsNullOrEmpty(value) Then
value = Nothing
End If
ExtractForeignKey(dictionary, value)
End Sub
End Class
The form view to display the field
<asp:FormView ID="FacilityInfo" runat="server" AllowPaging="True" DefaultMode="Insert"
DataKeyNames="facility_id">
<InsertItemTemplate>
<p>
<h2>
Enter the facility information:</h2>
</p>
<p>
<asp:Label ID="Label7" runat="server" Text="State" CssClass="detailheader"></asp:Label><br />
<asp:DynamicControl ID="facility_state" runat="server" DataField="facility_state" HtmlEncode="true"
Mode="Insert" CssClass="detailitem" />
</p>
</InsertItemTemplate>
</asp:FormView>
The model
Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations
<MetadataType(GetType(facilityMetadata))> _
Public Class facility
<Key()> _
Public Property facility_id As Integer
Public Property facility_state As String
End Class
Public Class facilityMetadata
<UIHint("LongText")> _
<DisplayName("Facility ID")> _
<Required(ErrorMessage:="Facility ID is required")> _
Public Property facility_id As Integer
<UIHint("State")> _
<DisplayName("State")> _
<StringLength(2, ErrorMessage:="State cannot be more than 2 characters")> _
<Required(ErrorMessage:="Facility state is required")> _
<RegularExpression("^[a-zA-Z]+$", ErrorMessage:="State can only contain letters.")> _
Public Property facility_state As String
End Class