2009-08-12 2 views
1

Ich folge diesem post.xVal - Erzeugt nur Regeln für das ID-Feld

Serverseitige Validierungen funktionieren wie erwartet. Aber die clientseitigen Validierer werden nur für das ID-Feld generiert.

Meine Linq2Sql Entity-Klasse hat zwei Eigenschaften ID & Kategorie und unten ist meine Metadaten Klasse

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

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

Methode eine Kategorie

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

Aktion erstellen in der Steuerung hinzufügen

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

Und die Ansicht

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

Jetzt Validierungsregeln für das ID-Feld xVal erzeugt nur.

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

Die serverseitige Validierung für CategoryName funktioniert einwandfrei. Warum generiert xVal keine Validierungsregeln für den CategoryName? Was mache ich falsch?

+0

Können Sie es als beantwortet, bitte, basierend auf Ihrem letzten Kommentar. Vielen Dank. – andymeadows

Antwort

1

Angeblich hat xVal 0.8 Buddy Klassen arbeiten. Sie können diesen Beitrag lesen Sie hier:

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

Wenn das Problem nicht beheben, versuchen Sie den neuesten Code für xVal nach unten ziehen und xVal.RuleProviders.PropertyAttributeRuleProviderBase::GetRulesFromTypeCore Modifizieren

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

auch sein, wenn diese behebt Ihr Problem, Sie könnten Steve Sanderson kontaktieren und ihn wissen lassen, dass dieser Fehler immer noch vorhanden ist.

+0

Der ältere Post, der in der Post verlinkt wurde, die ich las, hatte die alte xVal-DLL. Das Herunterladen der neuesten xVal-Binärdateien behob das Problem .. Danke – Zuhaib