2012-01-24 36 views
7

Tôi khá mới đối với MVC và tôi thực sự đang cố gắng làm quen với Mô hình ràng buộc. Tôi có một mô hình đơn giản mà tôi đã tạo ra trong một biểu mẫu. Tuy nhiên, khi tôi gửi biểu mẫu đó chỉ các giá trị hộp văn bản được chuyển sang bộ điều khiển. Tôi cần trường mô tả cũng được thực hiện bằng cách sử dụng DisplayTextFor. Đây có phải là một cái gì đó tôi sẽ phải làm một chất kết dính mô hình tùy chỉnh cho? Tôi có thể lấy một phím tắt và chỉ làm cho mô tả một hộp văn bản chỉ đọc mà không có biên giới vì vậy nó trông giống như văn bản, nhưng tôi muốn làm điều đó một cách chính xác. Đây là mã của tôi:MVC3 Không đăng toàn bộ mô hình

public class FullOrder 
{ 
    public List<FullOrderItem> OrderList { get; set; } 
    public string account { get; set; } 
    public string orderno { get; set; } 
} 

public class FullOrderItem 
{ 
    public int? ID { get; set; } 
    public int? OrderId { get; set; } 
    public string Description { get; set; } 
    public int Qty { get; set; } 
    public decimal? Price { get; set; } 
} 

đây là Xem

<table class="ExceptionAltRow"> 
    <tr style="background-color: #DDD;"> 
     <td class="strong" style="width:500px;"> 
      Description 
     </td> 
     <td class="strong" style="width:100px;"> 
      Qty 
     </td> 
     <td class="strong" style="width:100px;"> 
      Previous Purchases 
     </td> 
    </tr> 
    @for (int i = 0; i < Model.FullOrder.OrderList.Count(); i++) 
    { 
     <tr> 
      <td> 
       @Html.DisplayTextFor(m => m.FullOrder.OrderList[i].Description) 
      </td> 
      <td> 
       @Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" }) 
      </td> 
     </tr> 
    } 
    </table> 

đây là Bộ điều khiển:

[HttpPost] 
public ActionResult AddItem(FullOrder f) 
{ 
    //doesn't work description is not passed but qty is 
} 

Có cách nào mà tôi có thể nhận được mẫu của tôi chỉ đơn giản là vượt qua trên mô tả trên một bài đăng mặc dù nó không phải là một hộp văn bản cho mục ràng buộc từ mô hình của tôi?

Trả lời

2

Dữ liệu duy nhất sẽ được đăng lên ứng dụng của bạn là dữ liệu có sẵn trên biểu mẫu đang được gửi (trừ khi trường biểu mẫu bị tắt, tất nhiên). Bạn có thể ghi đè lên những gì bộ điều khiển nhìn thấy bằng cách thực hiện một custom model binder.

Trong trường hợp này, hình thức của bạn bao gồm nhiều trường hợp của một trường văn bản duy nhất:

@Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" }) 

Nếu bạn muốn mô tả và những thứ khác điền vào, họ cần phải có mặt trên biểu mẫu. Nếu họ không cần phải được hiển thị, sau đó bạn có thể sử dụng các helper HiddenFor:

@Html.HiddenFor(m => m.FullOrder.OrderList[i].Description) 

Xem thêm What does Html.HiddenFor do?

+0

cảm ơn vì sự giúp đỡ, chính xác những gì tôi cần phải biết. – mscard02

+0

Nếu câu trả lời hữu ích, bạn nên bấm vào mũi tên lên để chỉ ra như vậy. –

0

Chức năng DisplayTextFor chỉ sẽ đầu ra văn bản để DOM của trình duyệt. Ràng buộc của khung MVC về cơ bản nhìn vào các biến POST/GET và tự động đặt các giá trị đó cho mô hình của bạn.

Nếu bạn muốn tự động liên kết bất kỳ dữ liệu nào (chẳng hạn như văn bản mô tả), bạn sẽ phải lưu trữ dữ liệu đó vào một số loại đầu vào và/hoặc trường ẩn. Các trường ẩn hoạt động nhưng không hiệu quả vì bạn đang đặt một loạt các phần tử phụ trong HTML của mình và thậm chí có thể được người dùng chỉnh sửa bằng thứ gì đó như Firebug.

Khuyến cáo của tôi và những gì tôi đã luôn làm là hy vọng không có một số thông tin đã đăng trở lại, và chỉ cần đặt nó một cách rõ ràng trong phạm vi hành động điều khiển:

[HttpPost] 
    public ActionResult AddItem(FullOrder f) 
    { 
     // Next line is just showing that you should get the existing order 
     // from your data layer 
     FullOrder existingOrder = orderRepository.GetExistingOrder(); 

     // Now loop through f.OrderList and update the quantities 
     foreach(OrderItem item in f.OrderList) { 
      // Find the existing item and update the quantity. 
     } 

     // Now you have the original information from the DB along with 
     // updated quantities. 

     // Save results or do whatever is next 
     existingOrder.Save(); 
    } 
1

Tất nhiên bạn không thể làm cho nó hoạt theo cách đó,

Trước tiên, bạn nên biết rằng ràng buộc mô hình xảy ra về cơ bản bằng cách sử dụng dữ liệu gửi từ đầu vào ở phía máy khách. Html.DisplayTextFor helper không tạo ra đầu vào, nó tạo ra văn bản đơn giản. Các nội dung không tham gia vào dữ liệu, được gửi từ khách hàng khi biểu mẫu được gửi đi, do đó bạn không bị họ mô hình ràng buộc. Nếu bạn nhìn vào tài sản Request.Form, bạn sẽ thấy bằng chứng - không có trường mô tả.

Bạn có thể làm gì nếu muốn hiển thị văn bản và để mô tả tham gia vào các giá trị biểu mẫu, là sử dụng trường ẩn.MVC có helper cho điều này

@for (int i = 0; i < Model.FullOrder.OrderList.Count(); i++) 
    { 
     <tr> 
      <td> 
       @Html.DisplayTextFor(m => m.FullOrder.OrderList[i].Description) 
       @Html.HiddenFor(m => m.FullOrder.OrderList[i].Description) 
      </td> 
      <td> 
       @Html.TextBoxFor(m => m.FullOrder.OrderList[i].Qty, new { @style = "width:50px;" }) 
      </td> 
     </tr> 
    } 

Bằng cách này, hình thức nộp sẽ chứa các giá trị mô tả quá

+0

Thật tuyệt khi biết rằng HiddenFor hiển thị dưới dạng thẻ . – dotnetN00b

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