2012-03-23 2 views
1

У меня есть мнение, где я использую выпадающий список с перечислением:стороны клиента проверка для моего раскрывающегося списка, заполненного перечислимым значение

public enum MaterialWorthEnumViewModel 
{ 
    [Display(Name = "")] Undefined, 
    [Display(Name = "< 1.000€")] LessThan1000, 
    [Display(Name = "1.000€ < 10.000€")] Between1000And10000, 
    [Display(Name = "10.000€ < 100.000€")] Between10000And100000, 
    [Display(Name = "100.000€ < 25.000.000€")] Between100000And25000000, 
    [Display(Name = "> 25.000.000€")] GreaterThan250000000, 
} 

Я использую модель представления с этой точкой зрения:

public class MaterialEditNewViewModel 
{ 
    public int RequestID { get; set; } 
    ... 
    [EnumRequired] 
    public MaterialWorthEnumViewModel MaterialWorth { get; set; } 
} 

As вы можете видеть выше, я использовал пользовательскую проверку [EnumRequired] Я хватаю код из блога в Интернете.

[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] 
public class EnumRequiredAttribute : RequiredAttribute  
{ 
    private const string UNDEFINED_VALUE = "Undefined"; 
    public string UndefinedValue { get; set; } 

    public EnumRequiredAttribute() : this(UNDEFINED_VALUE)   
    {  } 

    public EnumRequiredAttribute(string undefinedValue) : base()   
    { 
     if (String.IsNullOrWhiteSpace(undefinedValue))    
     { 
      throw new ArgumentNullException("undefinedValue");    
     } 

     UndefinedValue = undefinedValue;   
    }   

    public override bool IsValid(object value)   
    {    
     if (value == null)    
     {     
      return false;    
     }    

     var undefined = Enum.Parse(value.GetType(), UndefinedValue);    
     return !Enum.Equals(value, undefined);   
    }  
} 

Ниже для клиентской стороне проверки

public class ModelClientValidationEnumRequiredRule : ModelClientValidationRule 
{ 
    public ModelClientValidationEnumRequiredRule(string errorMessage, string undefinedValue) 
    { 
     base.ErrorMessage = errorMessage; 
     base.ValidationType = "enumrequired"; 
     base.ValidationParameters.Add("undefinedvalue", undefinedValue); 
    } 
} 

public class EnumRequiredAttributeAdapter : DataAnnotationsModelValidator<EnumRequiredAttribute> 
{ 
    public EnumRequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, EnumRequiredAttribute attribute) 
     : base(metadata, context, attribute) 
    { } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     return new ModelClientValidationEnumRequiredRule[] 
     { 
      new ModelClientValidationEnumRequiredRule(base.ErrorMessage, Attribute.UndefinedValue) 
     }; 
    } 
} 

Ниже приведен Javascript для проверки на стороне клиента

Sys.Mvc.ValidatorRegistry.validators.enumrequired = function (rule) { 
    var undefinedValue = rule.ValidationParameters.undefinedvalue; 
    return function (value, context) { 
     return value != undefinedValue; 
    } 
} 

Я также обновил свой файл global.asax:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EnumRequiredAttribute), typeof(EnumRequiredAttributeAdapter)); 

Validati на работе очень хорошо на стороне сервера, но проверка на стороне клиента никогда не запускается. Итак, когда я не выбрал какое-либо значение в своем представлении для моего списка выпадающего списка, я дошел до действия в контроллере, а затем проверил проверку на стороне сервера, и я вернусь к представлению. Я пришел к выводу, что проверки на стороне клиента не произошло.

Может ли кто-нибудь помочь мне сделать правильную проверку на стороне клиента для этого выпадающего списка?

Спасибо. Я немного потерян.

+0

Вы используете ASP.NET MVC 3? –

ответ

2

Я не вижу никаких отношений между вашими EnumRequiredAttribute и другими 2 классами. Если вы используете ASP.NET MVC 3, вам необходимо связать свой собственный атрибут проверки с адаптером. Это может быть сделано в Application_Start:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(EnumRequiredAttribute), 
    typeof(EnumRequiredAttributeAdapter) 
); 

Также на вашей стороне клиента вы показали некоторый JS код, который зависит от Microsoft*.js библиотек. Теперь они устарели и больше не должны использоваться. Стандартом по умолчанию в ASP.NET MVC 3 для проверки на стороне клиента является плагин jquery.validate.

Итак, давайте возьмем пример.

Модель:

public class MyViewModel 
{ 
    [EnumRequired] 
    public MaterialWorthEnumViewModel MaterialWorth { get; set; } 
} 

Контроллер:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

View (Index.cshtml):

@model MyViewModel 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/enumrequiredadapter.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) 
{ 
    @Html.LabelFor(x => x.MaterialWorth) 
    @Html.EditorFor(x => x.MaterialWorth) 
    @Html.ValidationMessageFor(x => x.MaterialWorth) 
    <button type="submit">OK</button> 
} 

и, наконец, enumrequiredadapter.js адаптер:

(function ($) { 
    $.validator.unobtrusive.adapters.add('enumrequired', ['undefinedvalue'], function (options) { 
     options.rules['enumrequired'] = options.params; 
     if (options.message != null) { 
      options.messages['enumrequired'] = options.message; 
     } 
    }); 

    $.validator.addMethod('enumrequired', function (value, element, params) { 
     return value != params.undefinedvalue; 
    }); 

})(jQuery); 

Также не забудьте удалить все следы Microsoft*.js ссылок на сценарии с вашего сайта. И это в значительной степени.

+0

Он работает очень хорошо, даже для проверки клиента :) Большое спасибо. – Bronzato

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