0

記事を作成/編集するためのフォームがあります。すべての記事はユーザーに関連付けられています。

記事が公開された後、各記事へのリンクはユーザー名と記事のタイトルから構成されます ({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 つのエラーが表示される場合があります。

タイトル エラーとユーザー エラーは同期する必要がありますが、どうすればよいでしょうか。

または、タイトルとユーザーリストを操作する別の方法がありますか?

4

1 に答える 1

0

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>  

現在、条件は 1 つだけです。選択リストからユーザーを選択する必要があります。

タイトル + ユーザー 1 が無効で、リストからユーザー 2 を選択したときに、タイトル エラー メッセージを非表示 (リセット) する方法がわかりません。

反対に、ユーザーを選択してタイトルを編集した後、ユーザー エラー メッセージを非表示にします。

于 2009-12-10T01:06:29.293 に答える