在另一个控制器中使用功能?

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();
    }




}