确保字段在窗体视图中是唯一的

时间:2011-11-29 13:46:33

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

在我的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;            
}

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

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

1 个答案:

答案 0 :(得分:1)

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

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