我创建了一个自定义动态数据字段模板来显示状态下拉列表。下拉似乎没有问题。但它没有显示为“必需”。这意味着如果我把它留空,我仍然可以继续下一页。页面上的其他字段确实可以正确验证。
字段模板的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
答案 0 :(得分: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 ),然后重试。
有关一些信息: