Подтвердите уникальное сочетание заголовка и имени пользователя с помощью xVal
У меня есть форма для создания / редактирования статей. Каждая статья связана с пользователем.
После публикации статьи ссылка на каждую статью состоит из имени пользователя и заголовка статьи (и {userName}/{articleTitle} должен быть уникальной комбинацией):
/articles/{userName}/{articleTitle}
Класс статьи:
public class Article
{
public int ArticleId { get; set; }
[Required(ErrorMessage = "Please enter title")]
public string Title { get; set; }
[Required(ErrorMessage = "Please select a user")]
public int UserId { get; set; }
}
Посмотреть модель:
public class ArticleFormViewModel
{
public Article Article { get; set; }
public SelectList Users { get; set; }
public ArticleFormViewModel(Article article, Dictionary<int, string> allUsers)
{
Article = article;
List<SelectListItem> list = new List<SelectListItem>();
list.Add(new SelectListItem() { Value = "", Text = "Please select a user" });
foreach (var user in allUsers)
{
list.Add(new SelectListItem() { Value = user.Key.ToString(), Text = user.Value });
}
Users = new SelectList(list, "Value", "Text", Article.UserId);
}
}
Посмотреть:
<div id="validationSummary">
<%= Html.ValidationSummary("Please correct the errors and try again.") %>
</div>
<% using (Html.BeginForm()) {%>
<%= Html.Hidden("ArticleId", Model.Article.ArticleId) %>
<fieldset>
<legend>Article</legend>
<ul>
<li>
<label for="UserId">User: <%= Html.ValidationMessage("UserId", "*")%></label>
<%= Html.DropDownList("UserId", Model.Users) %>
</li>
<li>
<label for="Title">Title: <%= Html.ValidationMessage("Title", "*") %></label>
<%= Html.TextBox("Title", Model.Article.Title) %>
</li>
</ul>
<input type="submit" value="Save" />
</fieldset>
<% } %>
<%= Html.ClientSideValidation(typeof(Article))
.AddRule("Title", new RemoteRule(Url.Action("ValidateTitle")))
.UseValidationSummary("validationSummary", "Please correct the errors and try again.")%>
Я использую xVal для проверки.
ValidateTitle - это действие контроллера, которое подтверждает, что {userName}/{articleTitle} является уникальным. Работает с использованием Ajax.
Все отлично работает, когда я редактирую заголовок, но у меня возникают проблемы, когда я меняю пользователя в списке выбора. Если заголовок был недействительным для user1, и я выбрал user2, предыдущее сообщение об ошибке остается, и я не могу проверить, что заголовок для user2 действителен.
Я могу проверить имя пользователя так же, как я делаю это с заголовком, но будут случаи, когда будут отображаться 2 ошибки, говорящие о том, что комбинация имени пользователя и заголовка неверна.
Ошибки заголовка и ошибки пользователя должны быть синхронизированы, но как?
Или, может быть, есть другой способ работы с заголовком и списком пользователей?
1 ответ
xVal генерирует правила валидации (для плагина валидации jQuery):
<script type="text/javascript">xVal.AttachValidator(null,
{"Fields":[{"FieldName":"ArticleId","FieldRules":[{"RuleName":"DataType","RuleParameters":{"Type":"Integer"}}]},
{"FieldName":"Title","FieldRules":[{"RuleName":"Required","RuleParameters":{},"Message":"Please enter title"},
{"RuleName":"Remote","RuleParameters":{"url":"/articles/ValidateTitle"}}]},
{"FieldName":"UserId","FieldRules":[{"RuleName":"Required","RuleParameters":{},"Message":"Please select a user"}]}]},
{"ValidationSummary":{"ElementID":"validationSummary","HeaderMessage":"Please correct the errors and try again."}})</script>
Теперь есть только одно условие: пользователь должен быть выбран из списка выбора.
Я не знаю, как скрыть (сбросить) сообщение об ошибке заголовка, когда title + user1 недействительно, и я выбрал user2 из списка.
И наоборот: скрыть сообщение об ошибке пользователя после того, как я выбрал пользователя и отредактировать заголовок.