DropDownList для ссылочных значений - на Post: Create - NullReferenceException - PullRequest
1 голос
/ 21 февраля 2011

В SaveChanges я получаю исключение NullReferenceException.

Это мой DropDownList на мой взгляд:

@Html.DropDownList ("MaterialCategory.Id", Model.Categorieën)

Выбранное значение вставляется в: MaterialDetail.MaterialCategory.Id, но все остальные значения не вставляются (например, имя и описание категории).

[HttpPost]
    public ActionResult Create(db.MaterialDetail materiaal_detail)
    {
        try
        {
         //   TryUpdateModel<db.MaterialDetail>(materiaal_detail); ???
           materiaal_detail.Id = Guid.NewGuid();
            _db.SaveChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

Короче говоря, я получаю выбранный идентификатор, но не могу сохранить его в базе данных. Проблема должна быть где-то в сущностях.

MaterialDetail => ОК MaterialCategory, имеет идентификатор, и я подумал, что когда я сохраню его, он только вставит соответствующий GUID в MaterialDetail.CategoryId. Но этого не происходит.

А это мой Create (View)

<fieldset>
    <legend>MaterialDetail</legend>


    <div class="editor-label">
        Category
    </div>
    <div class="editor-field">
    @Html.DropDownList("MaterialCategory.Id", Model.Categorieën)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Materiaal.name)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Materiaal.name)
        @Html.ValidationMessageFor(model => model.Materiaal.name)
    </div>


    <div class="editor-label">
        @Html.LabelFor(model => model.Materiaal.description)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Materiaal.description)
        @Html.ValidationMessageFor(model => model.Materiaal.description)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Materiaal.inStock)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Materiaal.inStock)
        @Html.ValidationMessageFor(model => model.Materiaal.inStock)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
   </fieldset>

Guid вставляется в MaterialCategory.Id Как я могу решить это?

1 Ответ

1 голос
/ 21 февраля 2011

Все ваши поля ввода будут иметь префикс Materiaal, кроме выпадающего списка, в котором вы его жестко закодировали.Поэтому вам может потребоваться указать этот префикс, если вы хотите, чтобы механизм связывания модели мог правильно назначать значения:

[HttpPost]
public ActionResult Create([Bind(Prefix = "Materiaal")]db.MaterialDetail materiaal_detail)
{
    ...
}

или использовать модель верхнего уровня (та, которая содержит Materiaal):

[HttpPost]
public ActionResult Create(SomeModel model)
{
    db.MaterialDetail m = model.Materiaal;
    ...
}

Также я чувствую себя обязанным отметить, что использование ваших EF-моделей в представлениях - ПЛОХАЯ практика.Я бы порекомендовал вам разрабатывать модели представления, которые являются классами, специально разработанными для нужд представления и содержащими только свойства, необходимые для этого представления.Чтобы облегчить сопоставление между моделями и моделями представления, вы можете использовать AutoMapper .

Итак, здесь есть два сценария:

  1. Контроллер запрашиваетхранилище и выбирает модель.Контроллер отображает эту модель в модель представления и передает модель представления в представление

  2. Контроллер получает модель представления (в качестве аргумента) из представления.Контроллер отображает модель представления в соответствующую модель.Контроллер вызывает метод хранилища для обновления чего-либо, передавая ему модель.

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