Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象引用未设置为对象2的实例_C#_Asp.net Mvc 3_C# 4.0_.net 4.0_Nullreferenceexception - Fatal编程技术网

C# 对象引用未设置为对象2的实例

C# 对象引用未设置为对象2的实例,c#,asp.net-mvc-3,c#-4.0,.net-4.0,nullreferenceexception,C#,Asp.net Mvc 3,C# 4.0,.net 4.0,Nullreferenceexception,我在上面的代码中得到错误,如果!this.loginModel.LogInloginViewModel,ref displayFullName,ref标记 有人能帮我找出这本书的错误吗 好的,您有两个协构造函数-其中一个设置this.loginModel,尽管它没有检查它是否将其设置为非null值;另一个没有 正在调用哪个构造函数?如果它是无参数的,那么我并不奇怪你会犯这样的错误。你需要两个构造函数吗?这是由某个DI框架实例化的吗?好吧,您有两个协构造函数-其中一个设置this.loginMod

我在上面的代码中得到错误,如果!this.loginModel.LogInloginViewModel,ref displayFullName,ref标记


有人能帮我找出这本书的错误吗

好的,您有两个协构造函数-其中一个设置this.loginModel,尽管它没有检查它是否将其设置为非null值;另一个没有


正在调用哪个构造函数?如果它是无参数的,那么我并不奇怪你会犯这样的错误。你需要两个构造函数吗?这是由某个DI框架实例化的吗?

好吧,您有两个协构造函数-其中一个设置this.loginModel,尽管它没有检查它是否将其设置为非空值;另一个没有

正在调用哪个构造函数?如果它是无参数的,那么我并不奇怪你会犯这样的错误。你需要两个构造函数吗?这是由某个DI框架实例化的吗?

嗯,它看起来像是这样。loginModel为null,或者可能是调用this.loginModel.Login中的某个内容

我怀疑前者,因为你有

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();
        }
    } 
您从未设置过这个。loginModel

另外,在这个构造函数中

public AccountController() { }
您没有检查loginModel是否为空。我认为您应该删除无参数构造函数,并添加一个契约

public AccountController(LoginModel loginModel) {
    this.loginModel = loginModel;
}
嗯,它看起来像是this.loginModel为null,或者,它可能是调用this.loginModel.Login中的某个内容

我怀疑前者,因为你有

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();
        }
    } 
您从未设置过这个。loginModel

另外,在这个构造函数中

public AccountController() { }
您没有检查loginModel是否为空。我认为您应该删除无参数构造函数,并添加一个契约

public AccountController(LoginModel loginModel) {
    this.loginModel = loginModel;
}
当然,这是因为loginModel应该在构造函数中设置;但是MVC不会解雇设置它的构造函数;它将触发默认构造函数-因此在该点处为null;因此出现了NullReferenceException

我猜你是从别人那里继承了这个控制器;他们已经为它编写了单元测试——因此增加了构造函数;除非,正如Jon所提到的,站点上有一些DI框架处于活动状态,在这种情况下,它的配置是错误的

如果有一个DI框架正在创建控制器,那么请检查它是否可以解析LoginModel的实例。一个简单的方法,也是很好的实践,就是检查在该构造函数中传递的null LoginModel,并抛出一个异常,通常是null异常;这里的另一个答案提到的使用代码契约是一个很好的计划,然后再次运行站点。要么您将得到相同的错误,在这种情况下可能不涉及DI,要么您将得到ArgumentNullException——在这种情况下,存在异常,并且配置不当

如果没有,您需要修改控制器的默认构造函数,以创建LoginModel的默认实例-可能它在数据库或类似的地方有根-最终您需要查看项目的其余代码,以找出该实例。

当然,这是因为LoginModel应该在构造函数中设置;但是MVC不会解雇设置它的构造函数;它将触发默认构造函数-因此在该点处为null;因此出现了NullReferenceException

我猜你是从别人那里继承了这个控制器;他们已经为它编写了单元测试——因此增加了构造函数;除非,正如Jon所提到的,站点上有一些DI框架处于活动状态,在这种情况下,它的配置是错误的

如果有一个DI框架正在创建控制器,那么请检查它是否可以解析LoginModel的实例。一个简单的方法,也是很好的实践,就是检查在该构造函数中传递的null LoginModel,并抛出一个异常,通常是null异常;这里的另一个答案提到的使用代码契约是一个很好的计划,然后再次运行站点。要么您将得到相同的错误,在这种情况下可能不涉及DI,要么您将得到ArgumentNullException——在这种情况下,存在异常,并且配置不当


如果没有,您需要修改控制器的默认构造函数来创建LoginModel的默认实例-可能它在数据库中有根或类似的东西-最终您需要查看项目的其余代码来找出这个问题。

在有问题的行上放置一个调试器断点

当代码停在那里时,是否有任何变量为空


我猜这里的this.loginModel为null。不能对空实例调用实例方法。

在有问题的行上放置调试器断点

当代码停在那里时,是否有任何变量为空


我猜这里的this.loginModel为null。不能对空实例调用实例方法。

我猜loginModel是空的。如果AccountController是用无参数c实例化的
将导致此问题的构造函数。

我猜loginModel为空。如果AccountController是用无参数构造函数实例化的,这将导致此问题。

可能重复@JohnSaunders是的,我也同意这一点;不管代码增加多少;空引用总是归结为同一件事,真的。可能重复@JohnSaunders是的,我也同意这一点;不管代码增加多少;空引用总是归结为同一件事,真的。如果我同时使用两个框架,我需要使用DI框架吗?我怎样才能摆脱这个错误?@updev:我问这个问题是因为不清楚你的控制器是如何创建的。你需要那个无参数构造函数吗?如果我同时使用两个框架,我需要使用DI框架吗?我怎样才能摆脱这个错误?@updev:我问这个问题是因为不清楚你的控制器是如何创建的。你需要那个无参数构造函数吗?你是说它会使用空构造函数吗?是的,它会;MVC不知道如何直接填写控制器的构造函数。下面是一个MSDN实验室,它将依赖项注入与MVC3结合使用,这可能会有所帮助:。它引入了Unity DI框架。你是说它将使用空构造函数吗?是的,它会;MVC不知道如何直接填写控制器的构造函数。下面是一个MSDN实验室,它将依赖项注入与MVC3结合使用,这可能会有所帮助:。它引入了Unity DI框架。在这种情况下,在调用任何方法之前,您需要弄清楚如何获取非空loginModel。无论如何,这可能是一个静态方法的好地方。我见过的大多数登录方法都是无状态的,在这种情况下,最好使用静态方法。在这种情况下,在调用任何方法之前,您需要弄清楚如何获取非空loginModel。无论如何,这可能是一个静态方法的好地方。我见过的大多数登录方法都是无状态的,在这种情况下,首选静态方法。您需要确保this.loginModel不为null。我建议删除无参数构造函数,然后确保只将LoginModel的非null实例注入构造函数AccountControllerLoginModel LoginModel。您需要确保this.LoginModel不为null。我建议删除无参数构造函数,然后确保只将LoginModel的非空实例注入构造函数AccountControllerLoginModel LoginModel。