Sql server 在创建新对象时,将当前AspNetUser设置为表中某个表的默认UserId

Sql server 在创建新对象时,将当前AspNetUser设置为表中某个表的默认UserId,sql-server,asp.net-mvc,entity-framework,Sql Server,Asp.net Mvc,Entity Framework,我将实体框架和MVC用于个人用户帐户,我有一个名为“Kit”的表,其中有一个UserId列,该列链接到AspNetUser“ID”作为外键 当我创建一个新工具包并保存到数据库时,我希望工具包表的“UserId”是当前登录的ASPNetUser 但是当前,当我创建新的Kit对象时,它只是将UserId设置为NULL,并且从不拾取当前登录的用户 我错过了什么 控制器创建() [HttpPost] [ValidateAntiForgeryToken] [授权(Roles=“Admin”)] 公共操作结

我将实体框架和MVC用于个人用户帐户,我有一个名为“Kit”的表,其中有一个UserId列,该列链接到AspNetUser“ID”作为外键

当我创建一个新工具包并保存到数据库时,我希望工具包表的“UserId”是当前登录的ASPNetUser

但是当前,当我创建新的Kit对象时,它只是将UserId设置为NULL,并且从不拾取当前登录的用户

我错过了什么

控制器创建()

[HttpPost]
[ValidateAntiForgeryToken]
[授权(Roles=“Admin”)]
公共操作结果创建([Bind(Include=“KitId,KitName,ProductId,UserId”)]Kit)
{
if(ModelState.IsValid)
{
db.Kits.Add(kit);
db.SaveChanges();
返回操作(“索引”);
}
ViewBag.ProductId=新的选择列表(db.Products,“ProductId”,“ProductName”,kit.ProductId);
ViewBag.UserId=新选择列表(db.AspNetUsers,“Id”,“Email”,kit.UserId);
返回视图(套件);
}
查看


@LabelFor(model=>model.AspNetUser.Id,“User”,htmlAttributes:new{@class=“controllabel col-md-2”})
@EditorFor(model=>model.UserId,“Email”,new{htmlAttributes=new{@class=“form control”,@disabled=“disabled”})
这是我数据库中的行,您可以看到UserId从未填充过

KitId KitName ProductId可用LoanId UserId
3测试套件12空

禁用的控件不提交值,因此POST方法中的
UserId
的值将为
null
(属性的默认值-尽管不清楚为什么将其设置为null)。虽然可以将输入设置为只读(使用
new{@readonly=“readonly”}
),但正确的方法是在保存记录之前立即在POST方法中设置属性值,以防止恶意用户发回无效数据并发现其他用户的ID

if(ModelState.IsValid)
{
kit.UserId=User.Identity.GetUserId();//假定您的使用标识
db.Kits.Add(kit);
...
至少,您的
[Bind]
属性应排除
KitId
UserId
属性,但是首选方法,尤其是在编辑数据时,是使用仅包含视图中所需属性的视图模型,并且该视图模型还将包括DropDownList中的
IEnumerable
属性,而不是使用
ViewBag
。请参阅


作为旁注,命名
SelectList
与绑定到的属性相同(请参阅详细说明),使用
SelectList
构造函数的第四个参数设置
Selected
属性没有意义(绑定到模型属性时忽略该参数)

禁用的控件不提交值,因此POST方法中的
UserId
的值将为
null
(属性的默认值-尽管不清楚为什么将其设置为null)。而您可以将输入设为只读(使用
new{@readonly=“readonly”}
),正确的方法是在保存记录之前立即在POST方法中设置属性值,以防止恶意用户发回无效数据并发现其他用户的ID

if(ModelState.IsValid)
{
kit.UserId=User.Identity.GetUserId();//假定您的使用标识
db.Kits.Add(kit);
...
至少,您的
[Bind]
属性应排除
KitId
UserId
属性,但是首选方法,尤其是在编辑数据时,是使用仅包含视图中所需属性的视图模型,并且该视图模型还将包括DropDownList中的
IEnumerable
属性,而不是使用
ViewBag
。请参阅


作为旁注,命名
SelectList
与绑定到的属性相同(请参阅详细说明),使用
SelectList
构造函数的第四个参数设置
Selected
属性没有意义(绑定到模型属性时忽略该参数)

好的,所以没有办法让它显示在@Html.edit中,因为用户无法编辑?这是我禁用该字段的唯一原因。顺便说一句,谢谢你,这很有用。有道理。但是对于其他视图,这很好。在保存到数据库之前,我应该如何设置它。我有“kit.UserId=”在db.SaveChanges()之前;但我不确定要将什么值设置为UserId。我原以为是AspNetUser.Id,但我得到“非静态字段、方法或属性'AspNetUser.Id'需要对象引用”非常好!非常感谢。好的,那么没有办法让它显示在@Html.edit中,因为用户无法编辑?这是我禁用该字段的唯一原因。顺便说一下,谢谢你,这很有帮助。这很有意义。但是对于其他视图,这很好。在保存到数据库之前,我应该如何设置它。我有“kit.UserId=”就在db.SaveChanges()之前;但我不确定要将UserId设置为什么值。我原以为是AspNetUser.Id,但我得到的“非静态字段、方法或属性'AspNetUser.Id'需要对象引用”效果非常好!非常感谢。