MVC5 Сохранение обновленных данных Ошибка всегда требует загрузки нового файла - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь сохранить данные после редактирования в базе данных. Проблема с загрузкой файла. Мне нужно загружать новое изображение каждый раз, когда я хочу сохранить отредактированные данные, иначе контроллер подумает, что мое свойство 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...