ASP.NET MVC 3 форма «один ко многим» - PullRequest
5 голосов
/ 27 июля 2011

У меня есть эти классы, которые отображаются с использованием Entity Framework Code First:

public class Person
{
    public int PersonId { get; set; }
    public string Name { get; set; }
    //... additional properties
    [Required]
    public virtual ICollection<Address> Addresses { get; set; }
}
public class Address
{
    public int AddressId { get; set; }
    public string Street { get; set; }
    //... additional properties

    public int PersonId { get; set; }
    public virtual Person Person { get; set; }
}

Итак, используя ASP.NET MVC 3, как я могу выполнить представление редактирования для Person, чтобы заполнить все свойства Person внутриАдрес только в одной форме?

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Person</legend>

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

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

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

Это прекрасно работает для отображения входных данных с улицы из базы данных, но когда я делаю отправку, улица не меняется.

[HttpPost]
public ActionResult Edit(int id, FormCollection formCollection)
{
    Person person = unityOfWork.PersonRepository.GetById(id);

    UpdateModel<Person>(person);

    if (ModelState.IsValid)
    {
        unityOfWork.PersonRepository.Update(person);
        unityOfWork.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(person);
}

1 Ответ

3 голосов
/ 27 июля 2011

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

Было бы лучше создать ViewModel для этого экрана и выполнить перевод между ним и моделью базового домена.

Если бы вы предоставили возможность редактировать все адреса, я бы использовал * 1005Помощник BeginCollectionItem Стива Сандерсона .Но поскольку вы редактируете только один адрес, новый класс ViewModel со свойством Person и отдельным свойством Address будет проще, или используйте класс, включающий свойства Person и Address, относящиеся кэта точка зрения.

Я большой сторонник разделения проблем.В вашем приложении логически три модели;модель Entity, которая описывает реализацию хранения данных в вашей базе данных, модель View, которая описывает реализацию представления данных в пользовательском интерфейсе, и модель Domain, которая является логическим представлением данных в вашем приложении.Соблазнительно использовать одну и ту же модель для каждой цели, как вы делаете здесь.Но как только ваши требования становятся нетривиальными, это становится обузой, поэтому вам лучше создавать классы, которые работают лучше всего там, где они вам нужны.

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