МетаданныеТип и проверка клиента в ASP.NET MVC 2 - PullRequest
5 голосов
/ 19 марта 2010

Унаследованные свойства и MetadataType, похоже, не работают с проверкой на стороне клиента в ASP.NET MVC 2.

Проверка наших типов метаданных работает на сервере, как и ожидалось, но по какой-то причине не генерирует соответствующие клиентские сценарии для него. Проверка на стороне клиента запускается, как и ожидалось, для свойств с атрибутами DataAnnotations, установленными в PersonView, поэтому я знаю, что проверка на стороне клиента активна и что она работает. Кто-нибудь знает, если или как это можно исправить?

Вот что у нас есть:

public abstract class PersonView
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    [Required] public string PhoneNumber { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string AddressZipCode { get; set; }
    public string AddressCity { get; set; }
    public string AddressCountry { get; set; }
}

[MetadataType(typeof(CustomerViewMetaData))]
public class CustomerView : PersonView {}

[MetadataType(typeof(GuestViewMetaData))]
public class GuestView : PersonView {}

public class GuestViewMetaData
{
    [Required(ErrorMessage = "The guests firstname is required")] public string FirstName { get; set; }
    [Required(ErrorMessage = "The guests lastname is required")] public string LastName { get; set; }
}

public class CustomerViewMetaData
{
    [Required(ErrorMessage = "The customers firstname is required")] public string FirstName { get; set; }
    [Required(ErrorMessage = "The customers lastname is required")] public string LastName { get; set; }
    [Required(ErrorMessage = "The customers emails is required")] public string Email { get; set; }
}

Как видите, в этом нет ничего странного или странного ... Можно ли это исправить? Это ошибка в ASP.NET MVC 2?

Ответы [ 3 ]

2 голосов
/ 31 марта 2010

По словам официального представителя Microsoft , это ошибка в ASP.NET MVC 2 . Мне дали ссылку ниже, и, хотя сценарий не совсем такой же, похоже, проблема та же. Насколько я могу судить, это связано с унаследованными свойствами и поставщиком метаданных модели DataAnnotations. Ссылка говорит, что они попытаются решить проблему в ASP.NET MVC 3.

Asp.net MVC 2 RC2: проверка на стороне клиента не работает с переопределенными свойствами

1 голос
/ 28 января 2011

Может быть, уже слишком поздно, но так я смог решить эту ошибку.
Я создал собственный поставщик метаданных модели, который наследует от DataAnnotationsModelMetadataProvider и переопределяет метод CreateMetadata . Проблема заключается в том, что значение параметра containerType указывает на базовый класс, а не на унаследованный класс. Вот код

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(
        IEnumerable<Attribute> attributes, 
        Type containerType, 
        Func<object> modelAccessor, 
        Type modelType, 
        string propertyName)
    {

        if (modelAccessor != null && containerType != null)
        {                
            FieldInfo container = modelAccessor.Target.GetType().GetField("container");
            if (containerType.IsAssignableFrom(container.FieldType))
                containerType = container.FieldType;
        }

        var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);



        return modelMetadata;
    }
}

И, наконец, мы должны зарегистрировать этот пользовательский поставщик метаданных в Global.asax на Application_Start

ModelMetadataProviders.Current = new CustomModelMetadataProvider();

Извините за мой английский!

0 голосов
/ 26 марта 2010

Ты уверен? У меня есть сайт ASP.NET MVC 2, настроенный, как вы описываете, и у меня есть проверка на стороне клиента как обязательных, так и основанных на регулярных выражениях атрибутов, которая работает нормально. На данный момент он не работает с моими собственными валидаторами (которые получены из ValidationAttribute):

[MetadataType(typeof(AlbumMetadata))]
public partial class Album {}

public class AlbumMetadata {
    [Required(ErrorMessage = "You must supply a caption that is at least 3 characters long.")]
    [MinLength(3, ErrorMessage = "The caption must be at least {0} characters long.")]
    [RegularExpression(@".{3,}")]
    public string Caption { get; set; }
}

(MinLength в основном предоставляет более очевидный способ увидеть, что происходит в атрибуте регулярного выражения, который был добавлен для тестирования)

Тогда у меня будет следующее:

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>

<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm()) {%>
<fieldset>
    <legend>Album details</legend>
    <div class="form_row">
        <label for="Caption" class="left_label">Album caption:</label>
        <%= Html.TextBox("Caption", Model.Caption, new { @class = "textbox" })%>
        <%= Html.ValidationMessage("Caption", "*") %>
        <div class="cleaner">&nbsp;</div>
    </div>
    <div class="form_row">
        <label for="IsPublic" class="left_label">Is this album public:</label>
        <%= Html.CheckBox("IsPublic", Model.IsPublic) %>
    </div>
    <div class="form_row">
        <input type="submit" value="Save" />
    </div>
</fieldset>
<% } %>

Что приводит к тому, что клиент выводит следующее ниже тегов формы (отформатировано для ясности):

<script type="text/javascript">
//<![CDATA[
if (!window.mvcClientValidationMetadata)
{ window.mvcClientValidationMetadata = []; }
window.mvcClientValidationMetadata.push({
    "Fields":[
      {"FieldName":"Caption",
       "ReplaceValidationMessageContents":false,
       "ValidationMessageId":"Caption_validationMessage",
       "ValidationRules":[
         {"ErrorMessage":"You must supply a caption that is at least 3 characters long.",
          "ValidationParameters":{},
          "ValidationType":"required"},
         {"ErrorMessage":"The field Caption must match the regular expression \u0027.{3,}\u0027.",
          "ValidationParameters":{"pattern":".{3,}"},
          "ValidationType":"regularExpression"}]
      }],
      "FormId":"form0","ReplaceValidationSummary":false});
//]]>
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...