Обновление модели после HttpPost - PullRequest
3 голосов
/ 29 июня 2011

Я хочу обновить существующие объекты Product в базе данных с помощью изображений, но изображение успешно отправляется в БД только при создании новых объектов.

Я пытаюсь обновить свой объект таким образом

[HttpPost]
public ActionResult Edit(Product product, HttpPostedFileBase image)
    {

    if (ModelState.IsValid)
        {
            if (image != null)
            {
                product.ImageMimeType = image.ContentType;
                product.ImageData = new byte[image.ContentLength];
                image.InputStream.Read(product.ImageData, 0, image.ContentLength);
            }
            if (product.ProductID != 0)
                UpdateModel<Product>(repository.Products.FirstOrDefault(p => p.ProductID == product.ProductID));
            repository.SaveProduct(product);
            TempData["message"] = string.Format("{0} has been saved", product.Name);
            return RedirectToAction("Index");
        }
        return View(product);
    }
//repository.SaveProduct()


public void SaveProduct(Product product)
        {

    if (product.ProductID == 0)
            {
                context.Products.Add(product);
            }
            context.SaveChanges();
        }

Вид @ Upload new image: input type="file" name="Image" input type="submit" value="Save" @Html.ActionLink("Cancel and return to List", "Index") }</p> <p>

Ответы [ 5 ]

4 голосов
/ 20 июля 2011

Я заметил, что вы прочитали "Pro ASP.NET MVC 3 Framework" и столкнулись с той же проблемой, что и я.

У автора произошла ошибка, код должен быть (Вы должны ссылаться и использоватьсначала пространство имен System.Data.Entity:

    public void SaveProduct(Product product)
    {
        if (product.ProductID == 0)
        {
            context.Products.Add(product);
        }
        else
        {
            context.Entry(product).State = System.Data.EntityState.Modified;
        }

        context.SaveChanges();
    }
3 голосов
/ 29 июня 2011

Это все виды неправильных действий.

Вы должны использовать определенные ViewModel для ваших действий по редактированию и созданию.

Определите отдельный класс, содержащий свойства, которые вы хотите редактировать, и любую проверку пользовательского интерфейса.:

public class EditProductViewModel {
    [HiddenInput]
    public int Id {get;set;}
    [Required]
    public string Name {get;set;}
    [Required]
    public string Description {get;set;}
    public HttpPostedFileBase Image {get;set;}
}

Затем измените свой метод действия следующим образом:

[HttpPost]
public ActionResult Edit(EditProductViewModel viewModel) {
    if (ModelState.IsValid) {
        var product = repository.Products.FirstOrDefault(p => p.Id == viewModel.Id);
        // TODO - null check of product
        // now lefty righty
        product.Name = viewModel.Name;
        product.Description = viewModel.Description;

        if (viewModel.Image.ContentLength > 0) {
            product.ImageMimeType = image.ContentType; //  wouldn't trust this (better to lookup based on file extension)                
            product.ImageData = new byte[image.ContentLength];                 
            image.InputStream.Read(product.ImageData, 0, image.ContentLength); 
        }

        repository.SaveProduct(product);
        return RedirectToAction("Index");
    }

    return View(viewModel);
}

Вот хороший пост , в котором обсуждается шаблон ViewModel.

0 голосов
/ 29 июня 2011

Попробуйте это:

public void SaveProduct(Product product)
{
    if (product.ProductID == 0)
    {
        context.Products.Add(product);
    }
    else    // Update operation
    {
        context.Products.Attach(product);
    }
    context.SaveChanges();
}

Примечание. Я бы изменил способ определения вами нового или обновленного продукта.

0 голосов
/ 29 июня 2011

[HttpPost]

public RedirectToRouteResult Сохранить (TestViewModel viewModel)

{

TempData["Output"] = "Here is some response";
return RedirectToAction("Index", viewModel);

}

0 голосов
/ 29 июня 2011

Попробуйте сделать это

context.Products.Attach(product);

Примечание: только при обновлении, а не при вставке нового продукта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...