2010-11-20 37 views
17

Với các loại sau đâyLàm cách nào để chỉnh sửa một số điện thoại IE2umervới ASP.NET MVC 3?

public class SomeValue 
{ 
    public int Id { get; set; } 
    public int Value { get; set; } 
} 

public class SomeModel 
{ 
    public string SomeProp1 { get; set; } 
    public string SomeProp2 { get; set; } 
    public IEnumerable<SomeValue> MyData { get; set; } 
} 

Tôi muốn tạo ra một hình thức chỉnh sửa cho các loại SomeModel mà sẽ chứa các trường văn bản thông thường cho SomeProp1SomeProp2 và sau đó một bảng chứa một lĩnh vực văn bản cho mỗi SomeValue trong bộ sưu tập SomeModel.MyData .

Điều này được thực hiện như thế nào? Làm thế nào để các giá trị bị ràng buộc trở lại mô hình?

Tôi hiện có biểu mẫu hiển thị trường văn bản cho mỗi giá trị nhưng tất cả đều có cùng tên và cùng một Id. Điều này rõ ràng không phải là HTML hợp lệ và sẽ ngăn không cho MVC lập bản đồ các giá trị trở lại.

Trả lời

14

Bạn sẽ làm điều đó bằng cách sử dụng Mẫu biên tập. Bằng cách này, khung công tác sẽ quản lý mọi thứ (từ việc đặt tên đúng các trường nhập để gắn kết đúng các giá trị trở lại trong hành động bài đăng).

Bộ điều khiển:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     // In the GET action populate your model somehow 
     // and render the form so that the user can edit it 
     var model = new SomeModel 
     { 
      SomeProp1 = "prop1", 
      SomeProp2 = "prop1", 
      MyData = new[] 
      { 
       new SomeValue { Id = 1, Value = 123 }, 
       new SomeValue { Id = 2, Value = 456 }, 
      } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(SomeModel model) 
    { 
     // Here the model will be properly bound 
     // with the values that the user modified 
     // in the form so you could perform some action 
     return View(model); 
    } 
} 

View (~/Views/Home/Index.aspx):

<% using (Html.BeginForm()) { %> 

    Prop1: <%= Html.TextBoxFor(x => x.SomeProp1) %><br/> 
    Prop2: <%= Html.TextBoxFor(x => x.SomeProp2) %><br/> 
    <%= Html.EditorFor(x => x.MyData) %><br/> 
    <input type="submit" value="OK" /> 
<% } %> 

Và cuối cùng Mẫu Editor (~/Views/Home/EditorTemplates/SomeValue.ascx) sẽ được tự động gọi cho mỗi phần tử của bộ sưu tập MyData:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.SomeValue>" %> 
<div> 
    <%= Html.TextBoxFor(x => x.Id) %> 
    <%= Html.TextBoxFor(x => x.Value) %> 
</div> 
+0

Heh, tôi đoán tôi sẽ không đăng nó ngay bây giờ bởi vì bạn đang trả lời là đã tốt hơn :) Tôi không biết bạn có thể ràng buộc danh sách dễ dàng mặc dù. Cảm ơn – Buildstarted

+2

cho MVC3 không phải là nó tốt hơn để sử dụng Razor? – arame3333

1

IList thực hiện IEnumerable, do đó bạn có thể sửa đổi mô hình của bạn như sau:

public class SomeModel { 
    public string SomeProp1 { get; set; } 
    public string SomeProp2 { get; set; } 
    public IList<SomeValue> MyData { get; set; } 
} 

Bạn có thể sử dụng giao diện IModelBinder để tạo ra một chất kết dính cho mô hình cụ thể của bạn. Có một vài cách để làm điều đó. Bạn có thể tạo một EditorFor cshtml cho mô hình sẽ lặp qua danh sách SomeValue của bạn và xuất ra các id thích hợp và những gì không. Sau đó, trong việc thực hiện ModelBinder của bạn, khi đó, bạn sẽ đọc qua các id của mình và liên kết chúng một cách thích hợp. Tôi có thể đăng một mẫu làm việc trong một thời gian.

+0

Khi biểu mẫu được gửi, ViewEngin sẽ e chăm sóc ràng buộc các dữ liệu trở lại với các yếu tố chính xác trong Bộ sưu tập? –

+0

Bạn biết điều gì thực sự lạ ... Tôi có thể ** thề ** câu hỏi này hỏi một điều gì đó khác ... Tôi nghĩ tôi đã đọc hai câu hỏi cùng một lúc và trả lời sai câu hỏi ... Tôi sẽ thay đổi câu trả lời của tôi – Buildstarted

Các vấn đề liên quan