我的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()的定义。
有没有人有解决方案?
提前致谢!
答案 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视图隐藏在视图中!