2011-01-03 11 views
5

Lưu ý: Tôi đang sử dụng MVC3 + Razor, EF4, CF-CTP5ASP.NET MVC 3 Làm thế nào để có nhiều lĩnh vực tạo khả năng cho mẫu với ICollection tài sản vào Create view

  1. thế nào có thể bạn cho phép xem có khả năng thêm nhiều lớp Địa chỉ cho mỗi Tổ chức động trên máy khách và ràng buộc mạnh mẽ với mô hình trên bài đăng không?

  2. Làm cách nào bạn có thể có giá trị phân tích lượt xem trong mô hình nếu (ModelState.IsValid == false) sao cho nếu bạn nhập 3 địa chỉ và đăng mô hình không hợp lệ, nó sẽ điền lại địa chỉ số và giá trị?

Dưới đây là mô hình của tôi:

public class Organization 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Address> Addresses { get; set; } 
    public virtual ICollection<PhoneNumber> PhoneNumbers { get; set; } 
    ... 
} 

public class Address 
{ 
    public int Id { get; set; } 
    public string Line1 { get; set; } 
    public string Line2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string PostalCode { get; set; } 
    public string Country { get; set; } 
    public int Type { get; set; } 
} 

Tôi đang cố gắng để tìm ra cách bạn có thể có những hành động Tạo cho Tổ chức (/ Tổ chức/Tạo) xử lý tạo ra như vậy (ví dụ rằng địa chỉ và số điện thoại là một phần của mô hình đã gửi):

[HttpPost] 
public ActionResult Create(Organization organization) 
{ 
    if (ModelState.IsValid) 
    { 
     _db.Organizations.Add(organization); 
     _db.SaveChanges(); 
     return RedirectToAction("Details", organization.Id); 
    } 

    return View(organization); 

} 

Trả lời

1

câu hỏi của bạn là khá vaste :) Đây chỉ là một trong những cách yêu cầu của bạn có thể đạt được và tôi chắc chắn có tốt hơn tôi.

Tôi sẽ bắt đầu từ câu hỏi thứ hai của bạn:

Làm thế nào bạn có thể có quan điểm phân tích đánh giá cao trong mô hình nếu (ModelState.IsValid == false) như rằng nếu bạn nhập 3 địa chỉ và đăng một mô hình không hợp lệ, nó sẽ điền lại các địa chỉ số và với các giá trị thích hợp của chúng?

Nếu tôi hiểu chính xác yêu cầu của bạn, nó rất đơn giản đối với tôi. Câu trả lời chỉ đơn giản là mã chế độ xem của bạn để hiển thị nội dung Lớp mô hình và trả về mô hình không hợp lệ cho khách hàng chính xác như bạn đang thực hiện trong hành động Create của mình.

Nếu biểu mẫu của bạn (và các trường của nó) đã được trang trí với người trợ giúp ValidationSummary/ValidationMessage html, bạn cũng sẽ thấy thông báo xác thực.

  1. Làm thế nào bạn có thể cho phép người xem có khả năng thêm nhiều Địa chỉ lớp mỗi Tổ chức động trên máy khách, và liên kết mạnh với mô hình về bài đăng?

Bạn có thể có chế độ xem chính hiển thị các thuộc tính tổ chức và sau đó có chế độ xem khác hiển thị các địa chỉ liên quan. Ở đây bạn có thể đặt siêu liên kết hoặc nút mở hộp thoại để thêm đối tượng địa chỉ mới và sau đó làm mới danh sách địa chỉ khi hoàn tất. Cũng giống như cách bạn có thể chỉnh sửa và xóa các nút dưới dạng các biểu tượng trong danh sách.

Danh sách địa chỉ là một phần đánh dấu được xử lý hoàn toàn ở phía máy khách, được gắn chính xác với phía máy chủ Lớp mô hình phải tuân thủ một số quy tắc đặt tên đơn giản cho thuộc tính đầu vào của nó.

Để làm mặc định mẫu Binder lớp bind đúng hình thức của bạn sử dụng đoạn mã sau cho lớp Organization bạn

@using (Html.BeginForm()) { 
    @Html.HiddenFor(o => o.Id) 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>My Organization</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> 
     <br /> 
     <div id="container"> 
      <div>Address List</div> 
      @foreach (Address a in Model.Addresses) { 
       Html.EditorFor(a); 
      } 
     </div> 
     <div style="text-align:right;margin-top:14px;"> 
      <input type="submit" id="btnSubmit" value="Save" /> 
     </div> 
    </fieldset> 
} 

Để được tự động Bindable mã kết quả đối với hình thức nên nhìn như sau

<form action="..." id="..." method="post"> 
    <input type="hidden" name="Id" value="2"> 
    <input type="hidden" name="Name" value="Acme Corporation"> 

    <!-- markup for each address --> 
    <input type="hidden" name="Addresses[0].Id" value="1"> 
    <input type="hidden" name="Addresses[0].Line1" value="Line 1"> 
    <input type="hidden" name="Addresses[0].Line2" value="Line 2"> 
    ... and so on... 
</form> 

có thuộc tính của nó có tên là Addresses[index].PropertyName. Nếu bạn thêm địa chỉ mới trên máy khách, điều đó không quan trọng lắm: miễn là mã của bạn tôn trọng quy tắc này, bạn có thể có Trình mô hình hóa mặc định thực hiện công việc cho bạn.

Hope this helps

0

Tôi không chắc chắn nếu tôi hiểu câu hỏi của bạn một cách chính xác nhưng đối với câu hỏi 1 Tôi nghĩ rằng bạn đang tìm kiếm một ViewModel với. Như thế này có lẽ ..

OrganizationViewModel.cs

public class OrganizationViewModel 
{ 
    public OrganizationViewModel(Organization org, IList<Address> addresses) 
    { 
     this.Organization = org; 
     this.Addresses = addresses 
    } 
    public Organization Organization {get;set;} 
    public IList<Address> Addresses {get;set;} 
} 

OrganizationController.cs

public class OrganizationController : Controller 
{ 
    private readonly IOrganizationService _organizationService: //or whatever method you use 
    public OrganizationController(IOrganizationService orgService) 
    { 
     this._organizationService = orgService; 
    } 

    public ActionResult Item(int id) 
    { 
     var org = _organizationService.GetOrganizationById(id); 
     var addresses = _organizationService.GetOrgAddressesByOrgId(id); 
     return View(new OrganizationViewModel(program, addresses)); 
    } 
} 

Item.cshtml

@model OrganizationViewModel 
<h1>@Model.Organization.Name</h1> 
<ul> 
@foreach(var a in Model.Addresses) 
{ 
<li>@a.Line1</li> 
<li>@a.Line2</li>} 
</ul> 

Trước khi tôi cố gắng trả lời số 2 có lẽ bạn nên chỉ ra cho dù tôi hiểu đúng câu hỏi 1. Hy vọng điều này sẽ giúp.

0

Tôi đã quản lý việc này bằng LINQ to SQL. Bây giờ tôi đang cố gắng sử dụng Entity Framework thay vào đó, nhưng nó thực sự làm cho mọi thứ trở nên phức tạp hơn. Vì vậy, tôi không có một giải pháp cho bạn, nhưng có lẽ giải pháp L2S của tôi có thể giúp đỡ?

Sử dụng mô hình được tạo ra từ cơ sở dữ liệu của tôi, tôi có thể theo quan điểm của tôi làm điều này:

@for (int i = 0; i < Model.Contact.EmailAddresses.Count; ++i) 
{ 
    <li> 
     @Html.TextBoxFor(x => x.Contact.EmailAddresses[i].EmailAddress) 
     @Html.HiddenFor(x => x.Contact.EmailAddresses[i].EmailAddressID) 
    </li> 
} 

Tôi đã có một lớp xem mô hình:

class ContactViewModel 
{ 
    Contact contact { get; set; } 
} 

này làm việc tốt và trong hành động điều khiển của tôi, tôi có tôi Liên hệ với đối tượng với danh sách Contact.ContactEmailAddresses của nó đầy như tôi mong đợi.

Nhưng với EF, tôi không thể sử dụng [i] trên thuộc tính EmailAddresses được tạo từ cơ sở dữ liệu nữa. Điều tốt nhất tôi đã đưa ra là:

@Html.TextBox("Contact.EmailAddresses[" + i + "].EmailAddress", Model.Contact.EmailAddresses.ElementAt(i).EmailAddress) 
Các vấn đề liên quan