在另一个控制器中使用功能?
Using a function in another controller?
我制作了另一个控制器来保存我经常使用的功能,但是当我尝试在另一个控制器中使用该功能时,我得到了这样的错误
Object reference not set to an instance of an object.
这是我的新控制器
using Test.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
namespace Test.Controllers
{
public class DefaultController : Controller
{
private dbEntities db = new dbEntities();
public User GetUser()
{
string UserId = (Session["UserId"] != null) ? Session["UserId"].ToString() : User.Identity.GetUserId();
var Data = from a in db.User
where a.AspNetUserId.Equals(UserId)
select a;
return Data.FirstOrDefault();
}
}
}
这是我使用的地方
[HttpPost]
public void Edit(int Id)
{
var Default = new DefaultController();
var User = Default.GetUser();
db.SaveChanges();
}
关于如何在另一个控制器或多个控制器中使用相同功能的任何提示,因为这是我经常使用的一段代码?
创建一个基本控制器class并从需要使用通用功能的基本class继承您的控制器。
例如
public abstract class BaseController : Controller
{
private dbEntities db = new dbEntities();
public User GetUser()
{
string UserId = (Session["UserId"] != null) ? Session["UserId"].ToString() : User.Identity.GetUserId();
var Data = from a in db.User
where a.AspNetUserId.Equals(UserId)
select a;
return Data.FirstOrDefault();
}
}
然后在需要通用功能的地方继承class
public class SomeOtherController : BaseController
{
[HttpPost]
public void Edit(int Id)
{
var User = GetUser();
db.SaveChanges();
}
}
@vendettamit 的回答是正确的,我想从不同的角度提出一个不同的 solution/approach,这将在整个过程中帮助你很多,特别是如果你的应用程序越来越大并且有很多电话和互动在所有 classes 之间都需要。
我建议的第一件事是使用 class 来专门管理所有与当前用户、登录用户相关的事务……并为您的应用程序中可能需要的任何实现注入它。
这是一个扩展您发布的 class 功能的示例:
接口:
public interface ICurrentUser
{
string DisplayName { get; }
bool IsAuthenticated { get; }
string UserID { get; }
//bool isCustomer { get; }
bool IsInRole(string role);
}
具体class:
class Currentuser : ICurrentUser
{
public Currentuser(IPrincipal principal)
{
if (principal == null) throw new ArgumentNullException("principal");
IsAuthenticated = principal.Identity.IsAuthenticated;
DisplayName = principal.Identity.GetUserName();
UserID = principal.Identity.GetUserId();
//IsAuthenticated = identity.IsAuthenticated;
//DisplayName = identity.GetUserName();
_systemPrincipal = principal;
}
private readonly IPrincipal _systemPrincipal;
public string DisplayName { get; private set; }
public bool IsAuthenticated { get; private set; }
public string UserID { get; private set; }
// public bool isCustomer { get; private set; }
public bool IsInRole(string role)
{
return _systemPrincipal.IsInRole(role);
//return true;
}
}
DI 绑定:(使用 Ninject ,但您可以使用任何其他容器)
kernel.Bind<IUserStore<ApplicationUser>>().To<UserStore<ApplicationUser>>();
kernel.Bind<IPrincipal>().ToMethod(c => HttpContext.Current.User);
kernel.Bind<ICurrentUser>().To<Currentuser>();
在你的其他 classes 中的任何地方你都可以这样称呼它:
class Implementation
{
private ICurrentUser Currentuser ;
...
//constructor injection
Implementation (IcurrentUser u)
{
Currentuser = u;
}
[HttpPost]
public void Edit(int Id)
{
var User = Currentuser.GetUser();
db.SaveChanges();
}
}
我制作了另一个控制器来保存我经常使用的功能,但是当我尝试在另一个控制器中使用该功能时,我得到了这样的错误
Object reference not set to an instance of an object.
这是我的新控制器
using Test.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
namespace Test.Controllers
{
public class DefaultController : Controller
{
private dbEntities db = new dbEntities();
public User GetUser()
{
string UserId = (Session["UserId"] != null) ? Session["UserId"].ToString() : User.Identity.GetUserId();
var Data = from a in db.User
where a.AspNetUserId.Equals(UserId)
select a;
return Data.FirstOrDefault();
}
}
}
这是我使用的地方
[HttpPost]
public void Edit(int Id)
{
var Default = new DefaultController();
var User = Default.GetUser();
db.SaveChanges();
}
关于如何在另一个控制器或多个控制器中使用相同功能的任何提示,因为这是我经常使用的一段代码?
创建一个基本控制器class并从需要使用通用功能的基本class继承您的控制器。
例如
public abstract class BaseController : Controller
{
private dbEntities db = new dbEntities();
public User GetUser()
{
string UserId = (Session["UserId"] != null) ? Session["UserId"].ToString() : User.Identity.GetUserId();
var Data = from a in db.User
where a.AspNetUserId.Equals(UserId)
select a;
return Data.FirstOrDefault();
}
}
然后在需要通用功能的地方继承class
public class SomeOtherController : BaseController
{
[HttpPost]
public void Edit(int Id)
{
var User = GetUser();
db.SaveChanges();
}
}
@vendettamit 的回答是正确的,我想从不同的角度提出一个不同的 solution/approach,这将在整个过程中帮助你很多,特别是如果你的应用程序越来越大并且有很多电话和互动在所有 classes 之间都需要。 我建议的第一件事是使用 class 来专门管理所有与当前用户、登录用户相关的事务……并为您的应用程序中可能需要的任何实现注入它。
这是一个扩展您发布的 class 功能的示例:
接口:
public interface ICurrentUser
{
string DisplayName { get; }
bool IsAuthenticated { get; }
string UserID { get; }
//bool isCustomer { get; }
bool IsInRole(string role);
}
具体class:
class Currentuser : ICurrentUser
{
public Currentuser(IPrincipal principal)
{
if (principal == null) throw new ArgumentNullException("principal");
IsAuthenticated = principal.Identity.IsAuthenticated;
DisplayName = principal.Identity.GetUserName();
UserID = principal.Identity.GetUserId();
//IsAuthenticated = identity.IsAuthenticated;
//DisplayName = identity.GetUserName();
_systemPrincipal = principal;
}
private readonly IPrincipal _systemPrincipal;
public string DisplayName { get; private set; }
public bool IsAuthenticated { get; private set; }
public string UserID { get; private set; }
// public bool isCustomer { get; private set; }
public bool IsInRole(string role)
{
return _systemPrincipal.IsInRole(role);
//return true;
}
}
DI 绑定:(使用 Ninject ,但您可以使用任何其他容器)
kernel.Bind<IUserStore<ApplicationUser>>().To<UserStore<ApplicationUser>>();
kernel.Bind<IPrincipal>().ToMethod(c => HttpContext.Current.User);
kernel.Bind<ICurrentUser>().To<Currentuser>();
在你的其他 classes 中的任何地方你都可以这样称呼它:
class Implementation
{
private ICurrentUser Currentuser ;
...
//constructor injection
Implementation (IcurrentUser u)
{
Currentuser = u;
}
[HttpPost]
public void Edit(int Id)
{
var User = Currentuser.GetUser();
db.SaveChanges();
}
}