C # / ASP.NET MVC: я установил значение свойства, но оно все еще нулевое - PullRequest
0 голосов
/ 16 августа 2010

Я боролся за это в течение часа, и я не понимаю, почему есть проблема.

У меня есть абстрактный класс

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 связывал его, превратив в метод, проблема исчезла.

Ответы [ 2 ]

2 голосов
/ 16 августа 2010

Возможно, вы захотите переименовать IValidated в ValidationBase или что-то еще - префикс I обозначает интерфейс, а не базовый класс.

DB настраивается в конструкторе вашего контроллера? Я предполагаю, что это не так, что приводит к методу Register, присваивающему нулевую ссылку на model.DB, что приводит к вашему NullReferenceException.

Кроме того, MVC2 будет читать свойства во время привязки данных, чтобы попытаться проверить их . Это, наверное, то, что кусает тебя. Если вы измените IsValid со свойства на метод, проблема исчезнет.

1 голос
/ 16 августа 2010

Где вы создаете переменную экземпляра DB?

model.DB = DB

Где инициализируется нужная БД?

...