Проверка достоверности данных MVC2 с наследованием - PullRequest
2 голосов
/ 22 марта 2010

У меня есть класс .NET 2.0, свойства которого помечены как виртуальные. Мне нужно использовать этот класс в качестве модели в приложении MVC2. Итак, я создал класс .NET 3.5, унаследованный от класса .NET 2.0, и добавил атрибуты DataAnnotations в переопределенные свойства нового класса. Фрагмент того, что я сделал, ниже

// .NET 2.0 class
public class Customer
{
   private string _firstName = "";
   public virtual string FirstName
   {
      get { return _firstName; }
      set { _firstName = value; }
   }
}

// .NET 3.5 class
public class MVCCustomer : Customer
{
   [Required(ErrorMessage="Firstname is required")]
   public override string FirstName
   {
      get { return base.FirstName; }
      set { base.FirstName = value; }
   }
}

Я использовал класс в качестве модели для представления MVC2 с помощью помощников HtmlFor. Проверка на стороне сервера работает правильно, а проверка на стороне клиента - нет. В частности, ошибка проверки не отображается на странице.

Чего мне не хватает, или это возможно сделать только с помощью приятелей.

Спасибо.

РЕДАКТИРОВАТЬ 1: Сейчас я попробовал это с классами проверки друзей, и это тоже не работает.

РЕДАКТИРОВАТЬ 2: Теперь я понял, что лямбда-выражение, предоставленное помощникам HtmlFor, вызывает проблему. Например,

Html.TextBoxFor (m => m.FirstName) вызывает метод ModelMetadata.FromLambdaExpression, который оценивает DeclaringType для MemberExpression (expression.Body) как класс Customer, а не класс MVCCustomer.

Я пытался изменить лямбда-выражение на Html.TextBoxFor ((MVCCustomer m) => m.FirstName), но DeclaringType по-прежнему является Customer.

Есть ли способ, которым я могу получить DeclaringType типа MVCCustomer, а не Customer.

Ответы [ 2 ]

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

Теперь я справился с этим, используя новое ключевое слово для свойств в классе .net 3.5, как показано ниже

// .NET 2.0 class
public class Customer { 
  private string _firstName = "";
  public string FirstName
  {
     get { return _firstName; }
     set { _firstName = value; }
  }
}

// .NET 3.5 class
public class MVCCustomer : Customer {
   [Required(ErrorMessage="Firstname is required")]
   public new string FirstName 
   { 
      get { return base.FirstName; } 
      set { base.FirstName = value; }
   }
}

Теперь это работает, как и ожидалось, и атрибуты DataAnnotations из класса MVCCustimer применяются правильно.

Надеюсь, это поможет

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

Глупый вопрос, но вы включили следующие сценарии в свой файл вида / мастера?

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

Они необходимы для проверки на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...