【问题标题】:Ensure field is unique in a formview确保字段在表单视图中是唯一的
【发布时间】:2011-11-29 13:46:32
【问题描述】:

在我的asp 页面中,我有一个FormView,用于显示和编辑一个人的信息。每个人都有一个唯一的名字,我正在使用 CustomValidator 进行验证:

<asp:FormView runat = "server"                                     
              ID = "PersonFormView"
              DefaultMode = "Edit"
              DataSourceID = "onePersonDs"
              DataKeyNames = "PersonId">
    <EditItemTemplate>
        ...
        <asp:TextBox runat = "Server"
                     Id = "Name"                                                          
                     Text = '<%# Bind("Name") %>'/>
        ...
        <asp:CustomValidator 
            ID = "UniqueNameValidator"
            runat = "server"
            Display = "Dynamic"
            ControlToValidate = "Name"
            ErrorMessage = "Person already exists!" 
            OnServerValidate = "UniqueNameValidator_ServerValidate" />

为此使用自定义验证器的最佳方法是什么?我的 UniqueNameValidator_ServerValidate 看起来像这样:

public void UniqueNameValidator_ServerValidate(
    object sender, ServerValidateEventArgs e)
{
    // Check for a duplicate.
    var items = from r in db.Persons
                where r.Name == e.Value
                select r;
    e.IsValid = items.Count() == 0;            
}

只要用户尝试更改为不同的名称,此方法就会起作用。但是,如果用户尝试在不更改名称的情况下保存表单,则该名称将已在数据库中找到,并且验证将阻止保存发生。

如果有人能指出一些描述解决此问题的最佳方法的链接,我会很高兴。尽管这是一种常见的情况,在保持用户名唯一的同时仍然允许提交表单,但我还没有找到有关如何执行此操作的任何信息。

【问题讨论】:

    标签: asp.net validation formview unique-constraint customvalidator


    【解决方案1】:

    添加到where 条件,将 FormView 的 DataKey 值与人员的 PersonId 属性进行比较:

    var items = from r in db.Persons
                where r.Name == e.Value && r.PersonId != (Guid)PersonFormView.DataKey.Value
                select r;
    

    【讨论】:

    • 完美!我尝试在存储 PersonId 的 FormView 中使用 HiddenField。但是您的解决方案要好得多。
    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多