Я боролся за это в течение часа, и я не понимаю, почему есть проблема.
У меня есть абстрактный класс
public abstract class IValidated
{
public bool IsValid { get { return (GetRuleViolation() == null); } }
public abstract RuleViolation GetRuleViolation();
}
И класс проверки
public class RegisterModel : IValidated
{
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public MyDataContext DB { get; set; }
// ....
}
Когда я использую проверку, я получаю сообщение об ошибке
public ActionResult Register(RegisterModel model)
{
model.DB = DB;
if (model.IsValid) // an exception here
}
DB is null!Мне нужно передать объект datacontext в проверку, чтобы проверить, является ли электронная почта уникальной и тому подобное.
Вот как инициализируется БД:
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
DB = new MyDataContext();
}
Свойство DB:установить в методе Register, я отладил это.Но в методе класса IsValid он имеет значение null ...
UPDATE
Похоже, что инфраструктура MVC по какой-то причине запускает метод IsValid перед Register ActionResult (идо инициализации объекта БД).Я думаю, это потому, что он делает все "волшебное" дело с передачей параметров RegisterModel в представление.Поэтому я просто поставил
if (DB != null)
, и это помогло.
Очевидно, метод IsValid запускается снова, когда I вызывает его, и объект БД не является нулевымзатем.
ОБНОВЛЕНИЕ 2
Поскольку IsValid был свойством, ASP.NET MVC связывал его, превратив в метод, проблема исчезла.