我正在使用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
答案 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]
属性应排除KitId
和UserId
属性,但首选方法(尤其是编辑数据时)是使用仅包含这些属性的视图模型您需要在视图中,该视图模型还会包含来自下拉列表的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}}属性(绑定到模型属性时忽略它)