Ссылка на объект не установлена ​​для экземпляра объекта # 2 - PullRequest
1 голос
/ 21 февраля 2012
public class AccountController : Controller
{

    private LoginModel loginModel = null;

    #region Constructor
    public AccountController(LoginModel loginModel)
    {
        this.loginModel = loginModel;
    }

    public AccountController()
    {
    }
    #endregion

    #region Login
    //
    // GET: /Account/Login
    public ActionResult Login()
    {
        return View();
    }

    //
    // POST: /Account/Login
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Login(string userName, string password, bool rememberMe, string returnUrl)
    {
        try
        {
            string displayFullName = null, token = null;

            LoginViewModel loginViewModel = new LoginViewModel();
            loginViewModel.UserName = userName;
            loginViewModel.Password = password;
            loginViewModel.RememberMe = rememberMe;

            ModelState.AddModelErrors(loginViewModel.ValidateLogIn());

            if (!ModelState.IsValid)
            {
                return View();
            }

            //login failed than return view. 
            if (!this.loginModel.LogIn(loginViewModel, ref displayFullName, ref token))
            {
                ModelState.AddModelError("_FORM", PortalErrors.IncorrectDataMsg);
                return View();
            }

            if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }

        }
        catch (Exception exc)
        {
            ModelState.AddModelError("_FORM", PortalErrors.CommonErrMsg);
            return View();
        }
    } 

Я получаю сообщение об ошибке в приведенном выше коде, если (! This.loginModel.LogIn (loginViewModel, ref displayFullName, ref token))

Может ли кто-нибудь помочь с этим, чтобы найти, что не так в этом?

Ответы [ 5 ]

3 голосов
/ 21 февраля 2012

Ну, у вас есть два cosntructor - один из них устанавливает this.loginModel (хотя он не проверяет, что он устанавливает его в ненулевое значение); другой нет.

Какой конструктор вызывается? Если это параметр без параметров, то я не удивлен, что вы получаете эту ошибку. Вам нужны оба конструктора? Это создается какой-то структурой DI?

2 голосов
/ 21 февраля 2012

Конечно, потому что loginModel должен быть установлен в конструкторе; но MVC не будет запускать конструктор, который его устанавливает; он будет запускать конструктор по умолчанию - так что к этому моменту он будет нулевым; отсюда NullReferenceException.

Я собираюсь предположить, что вы унаследовали этот контроллер от кого-то другого; и что они написали для него модульные тесты - отсюда и дополнительный конструктор; если, как уже упоминал Джон, на сайте активна какая-то структура DI (в этом случае она неправильно настроена).

Если существует контроллер DI, создающий контроллер, - проверьте, что он может разрешить экземпляр LoginModel. Простой способ и хорошая практика - проверить, передается ли в этом конструкторе значение null LoginModel, и выдать исключение (обычно ArgumentNullException; использование контрактов кода, как упомянуто в другом ответе, является хорошим планом), а затем запустите сайт снова. Либо вы получите ту же ошибку (в этом случае, вероятно, DI не задействован), или вы получите свой ArgumentNullException - в этом случае есть, и он плохо настроен.

Если его нет, вам нужно изменить конструктор контроллера по умолчанию, чтобы создать экземпляр по умолчанию LoginModel - предположительно, он имеет корни в базе данных или что-то в этом роде - в конечном итоге вам нужно взглянуть на остальная часть кода проекта, чтобы понять это.

1 голос
/ 21 февраля 2012

Я предполагаю, что loginModel имеет значение null. Если был создан экземпляр AccountController с конструктором без параметров, который вызвал бы это.

1 голос
/ 21 февраля 2012

Поместите точку останова отладчика в рассматриваемой строке.

Когда код останавливается там, является ли любая из переменных нулевой?

Я предполагаю, что this.loginModel равно нулю.Вы не можете вызывать методы экземпляра для нулевых экземпляров.

1 голос
/ 21 февраля 2012

Что ж, похоже, this.loginModel равно нулю (или это может быть что-то в вызове this.loginModel.Login).

Я подозреваю, что первое, потому что у вас есть

public AccountController() { }

, где вы никогда не устанавливаете this.loginModel.

Кроме того, в этом конструкторе

public AccountController(LoginModel loginModel) {
    this.loginModel = loginModel;
}

Вы не проверяли, что loginModel не null.Я думаю, что вы удалите конструктор без параметров, и вы должны добавить контракт

Contract.Requires(loginModel != null);
...