获取MVC中的UserId以在View中使用

时间:2016-09-13 16:35:19

标签: asp.net asp.net-mvc

我的MVC 5网络应用程序中存在以下问题。我使用数据库第一种方法和实体框架来创建一个表[accountlist],该表[UserId][Id][AspNetUsers]列之间存在外键关系。现在,相关的accountlist.cshtml包含一个下拉菜单。我还尝试了@Html.HiddenFor(model => model.UserId, new { @Value = HttpContext.Current.User.Identity.Name}),但问题是我需要正确的用户ID而不是用户名(我不希望[UserName]的{​​{1}}成为主键。

不幸的是,solution中建议的[AspNetUsers]表示Identity不包含GetUserId()的定义。

有没有人有解决方案?

提前致谢!

4 个答案:

答案 0 :(得分:4)

@ stephen.vakil是对的。您需要导入名称空间。具体来说,您需要添加:

@using Microsoft.AspNet.Identity
@model Namespace.To.Foo

或者,如果您想更频繁地执行此操作,或者只是不想在视图中包含命名空间,则可以编辑项目的Web.config文件夹中的Views并添加它相反:

<?xml version="1.0"?>
<configuration>
  ...
  <system.web.webPages.razor>
    ...
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization" />
        <add namespace="System.Web.Routing" />
        <add namespace="Microsoft.AspNet.Identity" />

任何名称空间都可以自动用于每个视图。

答案 1 :(得分:1)

this是来自ben foster的asp.net mvc身份验证的最佳文章。它上次帮了我。

即使您没有使用实体框架

,它仍然有效

SigIn喜欢这个

var identity = new ClaimsIdentity(new[] {
                new Claim(ClaimTypes.Sid, userID)
            },    
            "ApplicationCookie");

        var ctx = Request.GetOwinContext();
        var authManager = ctx.Authentication;

        authManager.SignIn(identity);

创建新类

public class AppUser : ClaimsPrincipal
{
    public AppUser(ClaimsPrincipal principal)
        : base(principal)
    {
    }

    public int ID
    {
        get
        {
            return this.FindFirst(ClaimTypes.Sid).Value;
        }
    }   
}

让我们为Razor视图创建一个自定义基本视图页面,以提供对AppUser主体的访问:

public abstract class AppViewPage<TModel> : WebViewPage<TModel>
{
    protected AppUser CurrentUser
    {
        get
        {
            return new AppUser(this.User as ClaimsPrincipal);
        }
    }
}

public abstract class AppViewPage : AppViewPage<dynamic>
{
}

打开/views/web.config并设置pageBaseType:

<system.web.webPages.razor>
  <pages pageBaseType="NakedIdentity.Mvc.AppViewPage">

重建项目并更新Index.cshtml视图:

<p>
  User ID: @CurrentUser.ID?
</p>

答案 2 :(得分:1)

如果您使用的是SimpleMemberShip提供商,那么

import express from 'express'
import cors from 'cors'
import bodyParser from 'body-parser'
import path from 'path'
import mongoose from 'mongoose'
import routes from './routes'

mongoose.connect('mongodb://coolAddress');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', () => {
  console.log("mongoose connected")
})

const app = express()

const port = 3000

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors())
app.use(express.static(path.resolve(__dirname, '../coolClient/dist')));

app.use('/api', routes)

app.all('*', (req, res) => {
  res.sendFile(path.resolve(__dirname, '../coolClient/dist', 'index.html'));
})

app.listen(process.env.PORT || port, () => {
  console.log(`App listening on ${process.env.PORT || port}`)
})

并在控制器方法的顶部添加属性[InitializeSimpleMembership]。

答案 3 :(得分:0)

将此行添加到控制器构造函数中:

user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());

然后您将在控制器内的所有方法中拥有user.Id。出于安全考虑,请不要将您的用户ID视图隐藏在视图中!