在创建新对象时,将当前AspNetUser设置为一个表上的默认UserId

时间:2018-01-07 03:35:31

标签: sql-server asp.net-mvc entity-framework

我正在使用Entity Framework和MVC与个人用户帐户,我有一个名为" Kit"具有UserId列,该列链接到AspNetUser' ID'作为外键。

当我去创建一个新工具包并保存到数据库时,我想要' UserId'我的Kit表是当前登录的ASPNetUser。

但是目前当我创建新的Kit对象时,它只是将UserId设置为NULL并且永远不会选择当前登录的用户。

我在这里缺少什么?

控制器创建()

[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = "Admin")]
public ActionResult Create([Bind(Include = "KitId,KitName,ProductId,UserId")] Kit kit)
{
    if (ModelState.IsValid)
    {
        db.Kits.Add(kit);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    ViewBag.ProductId = new SelectList(db.Products, "ProductId", "ProductName", kit.ProductId);
    ViewBag.UserId = new SelectList(db.AspNetUsers, "Id", "Email", kit.UserId);
    return View(kit);
}

查看

<div class="form-group">
    @Html.LabelFor(model => model.AspNetUser.Id, "User", htmlAttributes: new { @class = "control-label col-md-2"})
    <div class="col-md-10">
        @Html.EditorFor(model => model.UserId, "Email", new { htmlAttributes = new { @class = "form-control", @disabled = "disabled" } })
    </div>
</div>

以下是我的数据库中的行,您可以看到从未填充过UserId

KitId   KitName ProductId   Available   LoanId  UserId
 3      TestKit    12         NULL       NULL    NULL

1 个答案:

答案 0 :(得分:2)

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

if (ModelState.IsValid)
{
    kit.UserId = User.Identity.GetUserId(); // assumes your using Identity
    db.Kits.Add(kit);
    ...

至少,您的[Bind]属性应排除KitIdUserId属性,但首选方法(尤其是编辑数据时)是使用仅包含这些属性的视图模型您需要在视图中,该视图模型还会包含来自下拉列表的IEnumerable<SelectListItem>属性,而不是ViewBag。请参阅What is ViewModel in MVC?

作为旁注,您将SelectList命名为与您的绑定无关的属性相同(请参阅Can the ViewBag name be the same as the Model property name in a DropDownList?以获取详细说明),并且没有必要设置{使用Selected构造函数的第4个参数的{1}}属性(绑定到模型属性时忽略它)