2009-08-12 17 views
1

Je suis le post.xVal - Génère des règles uniquement pour le champ ID

Les validations côté serveur fonctionnent comme prévu. Mais les validateurs côté client ne sont générés que pour le champ ID.

classe Mon Linq2Sql entité a deux propriétés ID & NomCatégorie et ci-dessous est ma classe Metadata

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

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

Méthode pour ajouter une catégorie

/// <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(); 
} 

Créer une action dans le contrôleur

[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(); 
} 

Et la vue

<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>() %> 

Maintenant xVal ne génère que des règles de validation pour le champ ID.

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

La validation côté serveur pour CategoryName fonctionne parfaitement. Pourquoi xVal ne génère pas de règles de validation pour le nom de catégorie? Qu'est-ce que je fais mal?

+0

Pouvez-vous le marquer comme répondant, s'il vous plaît, basé sur votre dernier commentaire. Merci. – andymeadows

Répondre

1

Soit dit en passant, xVal 0.8 a des classes buddy qui fonctionnent. Vous pouvez lire cet article ici:

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

Si cela ne permet pas de résoudre votre problème, essayez de tirer vers le bas le dernier code pour xVal et modifier xVal.RuleProviders.PropertyAttributeRuleProviderBase::GetRulesFromTypeCore être

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)); 
} 

De plus, si cette résout votre problème, vous pouvez contacter Steve Sanderson et lui faire savoir que ce bug est toujours présent.

+0

L'ancien post lié dans le post que je lisais avait l'ancienne DLL xVal .. le téléchargement des derniers binaires xVal fixé le problème .. Merci – Zuhaib