Убедитесь, что поле уникально в форме - PullRequest
0 голосов
/ 29 ноября 2011

На моей странице 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 Ответ

1 голос
/ 29 ноября 2011

Добавить в where условие, сравнивающее значение DataKey FormView со свойством PersonId человека:

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