5

tôi có các lớp học này, người được ánh xạ sử dụng Entity Framework Mã đầu tiên:ASP.NET MVC 3 One-To-Nhiều Mẫu

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; } 
} 

Vì vậy, sử dụng ASP.NET MVC 3, làm thế nào tôi có thể thực hiện các Chỉnh sửa Xem để Người điền tất cả các thuộc tính của Người trong một Địa chỉ trong một Biểu mẫu?

@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> 
} 

Điều này hoạt động tốt để hiển thị đầu vào với Đường từ cơ sở dữ liệu, nhưng khi tôi gửi, Đường không thay đổi.

[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); 
} 

Trả lời

3

Do cách trình kết nối mô hình phải sửa chữa bộ sưu tập, nó sẽ gặp khó khăn vì không có ID liên quan.

Sẽ tốt hơn nếu bạn tạo một ViewModel cho màn hình này và dịch giữa ViewModel và mô hình miền cơ bản.

Nếu bạn đang cung cấp cơ sở để chỉnh sửa tất cả địa chỉ, tôi sẽ sử dụng Steve Sanderson's BeginCollectionItem helper. Nhưng vì bạn chỉ chỉnh sửa một địa chỉ duy nhất, một lớp ViewModel mới có thuộc tính Person và một thuộc tính Address riêng biệt sẽ dễ dàng hơn hoặc sử dụng lớp bao gồm các thuộc tính từ Người và Địa chỉ có liên quan đến chế độ xem này.

Tôi là người đề xuất lớn về Tách mối quan tâm. Có ba mô hình hợp lý trong ứng dụng của bạn; mô hình Entity mô tả việc thực hiện lưu trữ dữ liệu trong cơ sở dữ liệu của bạn, mô hình Xem mô tả việc thực hiện biểu diễn dữ liệu trong giao diện người dùng và mô hình miền là biểu diễn logic của dữ liệu trong ứng dụng của bạn. Nó là hấp dẫn để sử dụng cùng một mô hình cho mỗi mục đích, như bạn đang làm ở đây. Nhưng ngay sau khi yêu cầu của bạn trở thành không tầm thường, nó trở thành một gánh nặng, vì vậy bạn nên tạo ra các lớp học hoạt động tốt nhất khi bạn cần chúng.