访问ASP.NET 5 / MVC6身份自定义配置文件数据属性 - c#

我使用asp.net 5 Web应用程序模板(Mvc6 / MVC core / Asp.net-5)制作了一个名为ShoppingList的示例Web应用程序。我想使用自定义字段名称DefaultListId扩展用户配置文件。

ApplicationUser.cs:

namespace ShoppingList.Models
{
    // Add profile data for application users by adding properties to the ApplicationUser class
    public class ApplicationUser : IdentityUser
    {
        public int DefaultListId { get; set; }
    }
}

在家庭控制器中,我想访问为此属性存储的数据。我试过了:

namespace ShoppingList.Controllers
{
    public class HomeController : Controller
    {
       private UserManager<ApplicationUser> userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));

        public IActionResult Index()
        {
           var userId = User.GetUserId();
           ApplicationUser user = userManager.FindById(userId);

            ViewBag.UserId = userId;
            ViewBag.DefaultListId = user.DefaultListId;

            return View();
        }
    //other actions omitted for brevity

但是我得到以下错误:

严重性代码说明项目文件行抑制状态
错误CS7036没有给出与
必需的形式参数'optionsAccessor'
'UserManager.UserManager(IUserStore,
IOptions,IPasswordHasher,
IEnumerable>,
IEnumerable>,ILookupNormalizer,
IdentityErrorDescriber,IServiceProvider,
ILogger>,
IHttpContextAccessor)'ShoppingList.DNX 4.5.1,ShoppingList.DNX核心
5.0 C:\ Users \ OleKristian \ Documents \ Programmering \ ShoppingList \ src \ ShoppingList \ Controllers \ HomeController.cs 15有效

和...

严重性代码说明项目文件行抑制状态
错误CS1061“ UserManager”不包含
'FindById'的定义,没有扩展方法'FindById'接受
可以找到类型为'UserManager'的第一个参数
(您是否缺少using指令或程序集
参考?)ShoppingList.DNX 4.5.1,ShoppingList.DNX Core
5.0 C:\ Users \ OleKristian \ Documents \ Programmering \ ShoppingList \ src \ ShoppingList \ Controllers \ HomeController.cs 20有效

参考方案

您不应像以往一样实例化自己的UserManager。这样做实际上非常困难,因为它需要您向构造函数传递很多参数(而且大多数情况下也很难正确设置)。

ASP.NET Core广泛使用了依赖项注入,因此您应该以自动接收用户管理器的方式来设置控制器。这样,您不必担心创建用户管理器:

public class HomeController : Controller
{
    private readonly UserManager<ApplicationUser> userManager;

    public HomeController (UserManager<ApplicationUser> userManager)
    {
        this.userManager = userManager;
    }

    // …
}

但是,为此,您首先需要设置ASP.NET身份以真正了解您的ApplicationUser,并将其用于存储用户身份。为此,您需要修改Startup类。在ConfigureServices方法中,您需要更改AddIdentity调用以使其引用您的实际类型:

services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

IdentityRole这里是指ASP.NET Identity使用的标准角色类型(因为您不需要自定义角色)。如您所见,我们还引用了ApplicationDbContext,它是您修改后的身份模型的实体框架数据库上下文;所以我们也需要设置那个。在您的情况下,它可能看起来像这样:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        // here you could adjust the mapping
    }
}

这将确保ApplicationUser实体实际上已正确存储在数据库中。我们差不多完成了,但是现在我们只需要将这个数据库上下文也告诉Entity Framework。因此,再次在ConfigureServices类的Startup方法中,确保调整AddEntityFramework调用以同时设置ApplicationDbContext数据库上下文。如果您还有其他数据库上下文,则可以将它们链接起来:

services.AddEntityFramework()
    .AddSqlServer()
    .AddDbContext<IdentityContext>(opts => opts.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]))
    .AddDbContext<DataContext>(opts => opts.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

就是这样!现在,Entity Framework知道了新的用户实体并将其正确映射到数据库(包括您的新属性),而ASP.NET Identity也知道了您的用户模型,并将其用于所有用户模型,您可以使用注入到控制器(或服务或其他任何东西)中来做事。

至于第二个错误,您得到这个是因为用户管理器没有UserManager方法。它仅作为FindById方法。在ASP.NET Core中,您实际上会在很多地方看到这一点,那里只有异步方法,因此请拥抱它并开始使您的方法也异步。

对于您的情况,您需要像这样更改FindByIdAsync方法:

// method is async and returns a Task
public async Task<IActionResult> Index()
{
    var userId = User.GetUserId();

    // call `FindByIdAsync` and await the result
    ApplicationUser user = await userManager.FindByIdAsync(userId);

    ViewBag.UserId = userId;
    ViewBag.DefaultListId = user.DefaultListId;

    return View();
}

如您所见,不需要太多更改即可使该方法异步。大多数都保持不变。

如何使用ASP.NET ViewState使用JavaScript - c#

我的页面中有UL,它为空。我开始使用JavaScript使用LI填充它。在回发阶段如何在asp.net中使用此新添加的动态数据?那是因为我的提交按钮是asp.net控件。我不想使用JS POST。谢谢 参考方案 我过去通过在隐藏字段中填充要发布的动态数据来完成此类操作,您可以-在回传之前触发JavaScript事件,该事件将数据从UL解析到隐藏字段中要么更新…

如何从.Net DLL获取公共出口列表? - c#

我可以使用“ dumpbin”和“ dll export”之类的工具来查看标准win32 DLL的公共入口点(“ exports”),例如Windows \ SYSTEM32 \ GDI32.dll。但是,当我在.Net DLL上使用这些相同的工具时,我看到的仅仅是 2000 .reloc 2000 .rsrc 48000 .text 我有一个C#/。Net…

将asp.net c#变量分配给javascript数组 - c#

我有2个工作部分的代码,需要将它们放在一起第1节-用户可以访问页面,查看和编辑数据库的内容,其中包括新闻文章,标题,相关链接等,我设法使其正常工作并将数据保存到数据库中第2条-该网站首页上的javascript新闻滚动器会写出一系列div,然后使用javascript和CSS对其进行旋转,使其看起来像在滚动,同样可以。新闻文章是从首页上硬编码的数组中提取的问…

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

ASP.NET MVC 5自定义登录,无需脚手架,数据库优先 - c#

我对asp.net和mvc还是很陌生,所以我正在努力学习尽可能多的知识...为此,我从头开始编写博客网站,但是我对身份验证和授权有些困惑。由于我倾向于不真正使用任何脚手架的东西,所以我首先要使用数据库,所以不希望asp.net身份为我创建表。我对散列和加盐密码很酷,并对照数据库检查用户,我遇到的麻烦是将用户设置为登录状态并检查他们应该能够访问什么。我真的很想…