Ошибка с ViewModels и Create / Edit Actions - PullRequest
1 голос
/ 07 октября 2010

Я пытаюсь создать веб-приложение ASP.NET MVC 2, используя базу данных Northwind, следуя инструкции NerdDinner, но теперь я продолжаю получать следующую ошибку при попытке РЕДАКТИРОВАТЬ продукт:

Изменено значение элемента 'SupplierID' объекта типа 'Supplier'. Член, определяющий идентичность объекта, не может быть изменен. Попробуйте добавить новый объект с новым идентификатором и удалить вместо него существующий.

Это происходит только тогда, когда я изменяю категорию и / или поставщиков (оба являются DropDownLists), остальные поля (флажок и текстовое поле) в порядке.

Я также не могу СОЗДАТЬ новый продукт, так как Model.IsValid всегда возвращает false по какой-то причине (без исключений).

Что я делаю не так?

ProductController.cs

    public ActionResult Edit(int id) {
        Product productToEdit = productsRepository.Get(id);

        return View(new ProductViewModel(productToEdit));
    }

    [HttpPost]
    public ActionResult Edit(int id, FormCollection formValues) {
        Product productToEdit = productsRepository.Get(id);

        if (TryUpdateModel(productToEdit, "Product")) {
            productsRepository.Save();
            return RedirectToAction("Details", new { id = productToEdit.ProductID });
        }

        return View(productToEdit);
    }

ProductViewModel.cs

public class ProductViewModel {

    public Product Product { get; private set; }
    public SelectList Suppliers { get; private set; }
    public SelectList Categories { get; private set; }

    public ProductViewModel(Product product) {
        this.Product = product;

        this.Suppliers = new SelectList(new SuppliersRepository()
            .GetAllSuppliers()
            .Select(s => new SelectListItem {
                Text = s.CompanyName,
                Value = s.SupplierID.ToString()
            }), "Value", "Text");

        this.Categories = new SelectList(new CategoriesRepository()
            .GetAllCategories()
            .Select(c => new SelectListItem {
                Text = c.CategoryName,
                Value = c.CategoryID.ToString()
            }), "Value", "Text");
    }
}

ProductForm.ascx

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Product.SupplierID) %>
        </div>

        <div class="editor-field">
            <%= Html.DropDownListFor(model => model.Product.Supplier.SupplierID, Model.Suppliers) %>
        </div>

Конечно, эти коды являются только выдержками из каждого контроллера и представлений. ProductViewModel - полный код. Я опустил ProductRepository класс.

1 Ответ

1 голос
/ 07 октября 2010

установите точку останова в методе действия вашего контроллера и прочитайте объект состояния модели. Осмотрите каждый ключ, чтобы проверить, есть ли ошибка. описание ошибки поможет. перед этим попробуйте

<div class="editor-field">
            <%= Html.DropDownListFor(model => model.SupplierID, Model.Suppliers) %>
        </div>

Это то, что я делаю при редактировании значения внешнего ключа через список в L2S. не уверен, что вы используете EF.

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