Я пытаюсь сохранить данные после редактирования в базе данных. Проблема с загрузкой файла. Мне нужно загружать новое изображение каждый раз, когда я хочу сохранить отредактированные данные, иначе контроллер подумает, что мое свойство img равно нулю. Поэтому я переписал свое действие редактирования так, чтобы оно мне понравилось, надеясь, что оно будет использовать мое загруженное изображение
[HttpPost]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult Edit([Bind(Include = "id,name,info,whatThisTeach,whatToKnow")] Major major, HttpPostedFileBase img)
{
if (ModelState.IsValid)
{
if(img != null)
{
major.img = new byte[img.ContentLength];
img.InputStream.Read(major.img, 0, img.ContentLength);
}
else
{
var m = db.Majors.Find(major.id);
major.img = m.img;
}
db.Entry(major).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View("Details", major);
}
Но когда я пытаюсь редактировать данные без загрузки нового изображения, это выдает мне эту ошибку:
System.InvalidOperationException HResult = 0x80131509
Сообщение = Прикрепление объекта типа 'MUC.Models.Major' не удалось, потому что
другой объект того же типа уже имеет тот же первичный ключ
значение. Это может произойти при использовании метода «Присоединить» или при настройке
состояние объекта «Неизменен» или «Изменен», если какие-либо объекты в
График имеет конфликтующие ключевые значения. Это может быть потому, что некоторые объекты
являются новыми и еще не получили сгенерированные базой данных значения ключей. В
В этом случае для отслеживания используется метод «Добавить» или «Добавленный» объект.
график, а затем установить состояние не новых объектов на «Неизменен» или
«Изменено» в зависимости от ситуации. Source = EntityFramework StackTrace:
в
System.Data.Entity.Core.Objects.ObjectContext.VerifyRootForAdd (Boolean
doAttach, String entitySetName, IEntityWrapper wrappedEntity,
EntityEntry Существующий Entry, EntitySet & entitySet, Boolean &
isNoOperation) в
System.Data.Entity.Core.Objects.ObjectContext.AttachTo (String
entitySetName, Object entity) в
System.Data.Entity.Internal.Linq.InternalSet 1.<>c__DisplayClassa.<Attach>b__9()
at System.Data.Entity.Internal.Linq.InternalSet
1.ActOnSet (Action
действие, EntityState newState, Object entity, String methodName) в
System.Data.Entity.Internal.Linq.InternalSet 1.Attach(Object entity)<br>
at
System.Data.Entity.Internal.InternalEntityEntry.set_State(EntityState
value) at
System.Data.Entity.Infrastructure.DbEntityEntry
1.set_State (EntityState
значение) в MUC.Controllers.MajorsController.Edit (Major Major,
HttpPostedFileBase img) в
C: \ Users \ Миике \ Desktop \ MUC \ MUC \ Контроллеры \ MajorsController.cs: линия
101 в System.Web.Mvc.ActionMethodDispatcher.Execute (ControllerBase
контроллер, параметры Object []) в
System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext
controllerContext, IDictionary 2 parameters) at
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext
controllerContext, ActionDescriptor actionDescriptor, IDictionary
2
параметры) при
System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39 (IAsyncResult
asyncResult, ActionInvocation innerInvokeState) в
System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 2.CallEndDelegate(IAsyncResult
asyncResult) at
System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase
1.End ()
в
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod (IAsyncResult
asyncResult) в
System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d ()
в
System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters. <> C__DisplayClass46.b__3f ()
и вот мой вид редактирования:
@model MUC.Models.Major
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Edit</title>
</head>
<body>
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script src="~/Scripts/ckeditor/ckeditor.js"></script>
@using (Html.BeginForm("Edit", "Majors", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Major</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.img, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@if (Model.img != null)
{
var base64 = Convert.ToBase64String(Model.img);
var imgsrc = string.Format("data:image/jpg;base64,{0}", base64);
<img src="@imgsrc" /><br/>
<input type="file" id="img" name="img"/>
}
else
{
<input type="file" id="img" name="img"/>
}
@Html.ValidationMessageFor(model => model.img, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.info, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.info, new { htmlAttributes = new { @id = "info", @class = "form-control" } })
@Html.ValidationMessageFor(model => model.info, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.whatThisTeach, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextAreaFor(model => model.whatThisTeach, new { htmlAttributes = new { @class = "form-control", @id = "whatThisTeach" } })
<script type="text/javascript">CKEDITOR.replace('whatThisTeach');</script>
@Html.ValidationMessageFor(model => model.whatThisTeach, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.whatToKnow, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextAreaFor(model => model.whatToKnow, new { htmlAttributes = new { @class = "form-control", @id = "whatToKnow" } })
<script type="text/javascript">CKEDITOR.replace('whatToKnow');</script>
@Html.ValidationMessageFor(model => model.whatToKnow, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
</body>
</html>