需要帮助解释 ajax 发布错误


private readonly UserService userService;
    public AccountController(UserService userService)
    {
        this.userService = userService;
    }
    [HttpPost]
    public ActionResult Login(string username, string password)
    {
        bool validUser = this.userService.ValidateUser(username, password);
       // bool validUser = UserService.ValidateUser(username, password);
        if (validUser)
        {
            FormsAuthentication.SetAuthCookie(username, true);
            return Json(new
                {
                    valid = true,
                    action = "Views/Home/Index"
                });
        }
        else
        {
            return Json(new
                {
                    valid = false,
                    action = "Views/Account/_LoginPartial"
                });
        }
    }

我的 ajax 帖子无法访问该方法Login,因为:

 private readonly UserService userService;
    public AccountController(UserService userService)
    {
        this.userService = userService;
    }

如果我删除此代码,它可以工作。但是为什么?如何在我的登录方法中使用userService而不像那样实例化它?

此控制器看起来像是打算与依赖注入工具一起使用。

如果有一个,则依赖项解析程序可能未正确配置。 如果您没有一个,那么可以使用nuget安装各种方法,例如ninject,unity,Simple injector等。

我的 ajax 帖子无法访问登录方法,因为:

private readonly UserService userService;
public AccountController(UserService userService)
{
    this.userService = userService;
}

答案是肯定的!您可能错过并需要一个工厂来使用所需的UserService为您创建此Controller(我想知道为什么不使用interface),否则,此Controller不会被实例化,因此不会调用Login操作。

这是一个 DI 构造注入,如果您的应用程序中有一个配置良好的控制器工厂,则应自动进行。

下面是您可以使用的简单自定义控制器工厂:

public class CustomControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        UserService userService = new UserService();
        IController controller = Activator.CreateInstance(controllerType, new[] { userService }) as Controller;
        return controller;
    }
} 

并且不要忘记注册它:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
      RegisterCustomControllerFactory ();
    }
    private void RegisterCustomControllerFactory ()
    {
      IControllerFactory factory = new CustomControllerFactory();
      ControllerBuilder.Current.SetControllerFactory(factory);
   }
}

阅读本文: 面向初学者 ASP.NET MVC 控制器依赖项注入

相关内容

最新更新