C# 对象引用未设置为对象2的实例
我在上面的代码中得到错误,如果!this.loginModel.LogInloginViewModel,ref displayFullName,ref标记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,尽管它没有检查它是否将其设置为非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。