2009-08-12 2 views
1

Я следую за этим post.xVal - генерирует правила только для поля ID

Проверка на стороне сервера работает должным образом. Но клиентские валидаторы генерируются только для поля ID.

Мой Linq2Sql Entity Класс имеет два свойства 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? Что я делаю не так?

+0

Вы можете пометить его как ответ, пожалуйста, на основе вашего последнего комментария. Благодарю. – andymeadows

ответ

1

Предположительно, xVal 0.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)); 
} 

Кроме того, если исправляет вашу проблему, вы можете обратиться к Стиву Сандерсону и сообщить ему, что эта ошибка все еще присутствует.

+0

Старшее сообщение, связанное в сообщении, которое я читал, имело старую dll xVal .. загрузка последних бинарных файлов xVal исправила проблему .. Спасибо – Zuhaib

Смежные вопросы