1

私はこの投稿をフォローしています。

サーバー側の検証は期待どおりに機能します。ただし、クライアント側のバリデーターはIDフィールドに対してのみ生成されます。

私のLinq2Sqlエンティティクラスには2つのプロパティIDとCategoryNameがあり、以下は私のメタデータクラスです

[MetadataType(typeof(BookCategoryMetadata))]
public partial class BookCategory{}

public class BookCategoryMetadata
{
    [Required]
    [StringLength(50)]
    public string CategoryName { get; set; }
}

カテゴリを追加する方法

/// <summary>
/// Adds the category.
/// </summary>
/// <param name="category">The category.</param>
public void AddCategory(BookCategory category)
{
    var errors = DataAnotationsValidationHelper.GetErrors(category);
    if (errors.Any()) {
        throw new RulesException(errors);
    }

    _db.BookCategories.InsertOnSubmit(category);
    _db.SubmitChanges();
}

コントローラでアクションを作成する

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "ID")]BookCategory category)
{
    try {
        _repository.AddCategory(category);
    } catch (RulesException ex) {
        ex.AddModelStateErrors(ModelState, "");
    }

    return ModelState.IsValid ? RedirectToAction("Index") : (ActionResult)View();
}

そして眺め

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Create</h2>

<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="CategoryName">CategoryName:</label>
            <%= Html.TextBox("CategoryName") %>
            <%= Html.ValidationMessage("CategoryName", "*") %>
        </p>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

<div>
    <%=Html.ActionLink("Back to List", "Index") %>
</div>
<%= Html.ClientSideValidation<BookCategory>() %>

現在、xValはIDフィールドの検証ルールのみを生成します。

<script type="text/javascript">xVal.AttachValidator(null, {"Fields":[{"FieldName":"ID","FieldRules":[{"RuleName":"DataType","RuleParameters":{"Type":"Integer"}}]}]})</script>

CategoryNameのサーバー側の検証は完全に機能します。xValがCategoryNameの検証ルールを生成しないのはなぜですか?私は何が間違っているのですか?

4

1 に答える 1

1

おそらく、xVal0.8にはバディクラスが機能しています。あなたはここでこの投稿を読むことができます:

[ http://xval.codeplex.com/Thread/View.aspx?ThreadId=54300] [1]

それでも問題が解決しない場合は、xValの最新のコードをプルダウンして、次のように変更xVal.RuleProviders.PropertyAttributeRuleProviderBase::GetRulesFromTypeCoreしてみてください

 protected override RuleSet GetRulesFromTypeCore(Type type)
 {
   var typeDescriptor = metadataProviderFactory(type).GetTypeDescriptor(type);
   var rules = (from prop in typeDescriptor.GetProperties().Cast<PropertyDescriptor>()
                         from rule in GetRulesFromProperty(prop)
                         select new KeyValuePair<string, Rule>(prop.Name, rule));

   var metadataAttrib = type.GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().FirstOrDefault();
   var buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : type;
   var buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast<PropertyDescriptor>();
   var modelClassProperties = TypeDescriptor.GetProperties(type).Cast<PropertyDescriptor>();

   var buddyRules =  from buddyProp in buddyClassProperties
                              join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name
                              from rule in GetRulesFromProperty(buddyProp)
                              select new KeyValuePair<string, Rule>(buddyProp.Name, rule);

   rules = rules.Union(buddyRules);
   return new RuleSet(rules.ToLookup(x => x.Key, x => x.Value));
 }

また、これで問題が解決した場合は、Steve Sandersonに連絡して、このバグがまだ存在することを知らせてください。

于 2009-08-12T22:35:34.277 に答える