Question

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
Was it helpful?

Solution

I think the problem is

<asp:ListItem Value="-1" Text=""></asp:ListItem>

that located inside your DropDownList.

Try use

<asp:ListItem Value="" Text=""></asp:ListItem>

instead of you are using.

EDIT:

I have just simulated your problem and I have found that you are using AutoEventWireup Page attribute of your custom field template

AutoEventWireup="false"

that prevent your Page_Load event to be automatically hooked to the page's Load event.

Change the value of this Page attribute to true (or remove one, because the default value is true) and try again.

For some information:

What does AutoEventWireUp page property mean?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top