[英]mvc insert cannot be null error in entity framework
我收到一个例外消息,说用户电子邮件不能为null。 User.Identity.Name;
设置为用户的电子邮件地址,但是当我尝试创建新帖子时,抛出异常:
Cannot insert the value NULL into column 'BlogUserEmail', table
'Blog.dbo.Posts'; column does not allow nulls. INSERT fails.\r\nThe
statement has been terminated.
我不确定如何使用User.Identity.Name;
添加用户的电子邮件地址User.Identity.Name;
到后期创建方法。 在使用User.Identity.Name;
身份验证方法中,它工作正常User.Identity.Name;
。 但是,我在Entity Framework 5中创建了一些额外的表,在Post表中,我将BlogUserEmail作为外键:
![在此处输入图片描述] [1]
视图:
@model MyBlogger.Post
@{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Post</legend>
<div class="editor-label"> // I changed this area
@Html.LabelFor(model => model.BlogUserEmail, User.Identity.Name)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.BlogUserEmail)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.CategoryId, "Category")
</div>
<div class="editor-field">
@Html.DropDownList("CategoryId", String.Empty)
@Html.ValidationMessageFor(model => model.CategoryId)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ShortDescription)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ShortDescription)
@Html.ValidationMessageFor(model => model.ShortDescription)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Meta)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Meta)
@Html.ValidationMessageFor(model => model.Meta)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UrlSlug)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UrlSlug)
@Html.ValidationMessageFor(model => model.UrlSlug)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Published)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Published)
@Html.ValidationMessageFor(model => model.Published)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PostedOn)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PostedOn)
@Html.ValidationMessageFor(model => model.PostedOn)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Modified)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Modified)
@Html.ValidationMessageFor(model => model.Modified)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
由于您是从User.Identity.Name进行选择的,因此可以在HttpPost方法中进行分配。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Post post)
{
post.BlogUserEmail = User.Identity.Name
try
{
if (ModelState.IsValid)
{
db.Posts.Add(post);
db.SaveChanges();
return RedirectToAction("Index");
}
var email = User.Identity.Name;
ViewBag.BlogUserEmail = new SelectList(db.BlogUsers, email);
ViewBag.CategoryId = new SelectList(db.Categories, "Id", "Name", post.CategoryId);
return View(post);
}
catch (DbEntityValidationException e)
{
var newException = new FormattedDbEntityValidationException(e);
throw newException;
}
}
由于它不是“创建视图”中的可编辑字段,因此,您也可以采用放置HiddenField的方法。
请记住,在Post方法中,只读标签不会绑定到您的模型。
如果可以更改帖子形式的电子邮件(也许不是现在),但是可以及时更改,则可以将其添加为具有默认值的隐藏字段。
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Post</legend>
<div class="editor-label"> // I changed this area
@Html.LabelFor(model => model.BlogUserEmail, User.Identity.Name)
</div>
<div class="editor-field">
@Html.ValidationMessageFor(model => model.BlogUserEmail)
</div>
@* Hidden Field *@
@Html.HiddenFor(model => model.BlogUserEmail,new { value = User.Identity.Name })
// rest of the html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.