0

状態のドロップダウン リストを表示するカスタム動的データ フィールド テンプレートを作成しました。ドロップダウンは問題ないようです。しかし、「必須」として表示されていません。つまり、空白のままにしても、次のページに進むことができます。ページの他のフィールドは正しく検証されます。

フィールド テンプレートの HTML

<%@ 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" />

フィールド テンプレートのコード ビハインド

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

フィールドを表示するフォーム ビュー

<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>

モデル

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
4

1 に答える 1

0

問題は

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

DropDownList 内にあるもの。

使ってみる

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

あなたが使用している代わりに。

編集:

問題をシミュレートしたところ、カスタム フィールド テンプレートのAutoEventWireup Page 属性を使用していることがわかりました

AutoEventWireup="false"

Page_Load イベントがページの Load イベントに自動的にフックされるのを防ぎます。

この Page 属性の値をtrueに変更して(または、デフォルト値がtrueであるため、値を削除して)、再試行してください。

いくつかの情報について:

AutoEventWireUp ページ プロパティの意味は何ですか?

于 2013-04-03T17:02:22.700 に答える