2013-05-11 37 views
5

Tôi cần chuyển mảng sang phương thức POST. Nhưng tôi rõ ràng là thiếu sometging My view nhìn một cái gì đó như thế này:asp.net mvc 3 C# mảng bài biến

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Klausimynas.Models.Rezultat>" %> 

<input type="text" name="x[1]"> 
<input type="text" name="x[2]"> 
<input type="text" name="x[3]"> 
<input type="text" name="x[4]"> 
<input type="text" name="x[5]"> 
<input type="text" name="x[6]"> 
<input type="text" name="x[7]"> 

khai phương pháp của tôi trông như thế này:

[HttpPost] 
public ActionResult LetsTest(IEnumerable<Rezultat> rez) 

và khi tôi đang cố gắng để trích xuất dữ liệu tôi nhận được giá trị gia tăng không thể rỗng. Tôi đang thiếu gì?

+0

Thuộc tính nào của 'rez' là bạn đang cố gắng ràng buộc các trường này?Bạn không thể liên kết giá trị hộp văn bản thành một loại phức tạp. Trừ khi thuộc tính của bạn là 'rez.x', điều này sẽ không hoạt động. –

+0

Để int, nhưng tôi đã thay đổi nó thành chuỗi tôi nhận được kết quả tương tự –

+0

Nhưng thuộc tính của đối tượng 'Rezultat' mà bạn đang cố ràng buộc là gì? –

Trả lời

0

Kiểm tra mô hình ràng buộc với danh sách here. Các mục được đăng cần phải ở định dạng nhất định để có thể truy xuất chúng dưới dạng danh sách trong tác vụ ĐĂNG.

1

nếu bạn thực sự wnat để làm điều đó theo cách này bạn phải sử dụng Tôi nghĩ Form Collection

[HttpPost] 
public ActionResult LetsTest(FormCollection collection, IEnumerable<Rezultat> rez) 
{ 

    string[] inputs = new string[6]; 
    for(int i=1; i<8; i++) 
    { 
     //get all your array inputs 
     inputs[i-1]=collection["x["+i+"]"] 
    } 

} 
6

Có một vài điều sai ở đây:

  1. xem của bạn được đánh máy để Rezultat nhưng bạn đang cố gắng xử lý mô hình như là một IEnumerable<Rezultat>.
  2. Bạn đang cố gắng ràng buộc mỗi hộp văn bản thành x[i] - tương đương với Model.x[i] - khi bạn thực sự muốn gắn nó vào [i].x (ví dụ: Model[i].x).

Vì vậy, để sửa lỗi này, bạn cần phải thay đổi một vài điều.

Trước tiên, thay đổi chế độ xem của bạn thành kế thừa System.Web.Mvc.ViewPage<IEnumerable<Klausimynas.Models.Rezultat>>. Giờ đây, chế độ xem của bạn có thể vượt qua một số IEnumerable<Rezultat>, đó là hành động của bộ điều khiển của bạn.

Thứ hai, thay đổi này:

<input type="text" name="x[0]"> 

Để này:

<input type="text" name="[0].x"> 

Lý do cho điều này là người đầu tiên sẽ cố gắng để ràng buộc các giá trị cho Model.x[0], đó là (hoặc sẽ được, khi bạn đã nhập đúng chế độ xem của mình) tương đương với phần tử đầu tiên trong thuộc tính x của phiên bản IEnumerable<Rezultat>. Điều này rõ ràng là không hoàn toàn đúng, vì số IEnumerable cho thấy không có thuộc tính x. Những gì bạn muốn là để ràng buộc Model[0].x, là tài sản x của đối tượng Rezultat tại chỉ số 0.

Vẫn còn tốt hơn, sử dụng một helper để tạo tên cho bạn:

for(int i=0; i < Model.Count; i++) 
{ 
    @Html.TextBoxFor(m => m[i].x) 
} 
0

Thay đổi mã xem bạn như sau:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Klausimynas.Models.Rezultat>" %> 

<input type="text" name="x[0]" /> 
<input type="text" name="x[1]" /> 
<input type="text" name="x[2]" /> 
<input type="text" name="x[3]" /> 
<input type="text" name="x[4]" /> 
<input type="text" name="x[5]" /> 
<input type="text" name="x[6]" /> 

Cập nhật: Trên những suy nghĩ thứ 2, tôi nghĩ rằng đây là vấn đề thực tế của bạn, bạn đang bắt đầu từ 1-7, thay vì 0-6.

Cảm ơn Ant.

+1

Bạn dự đoán rằng một thể hiện của 'Rezultat' có một thuộc tính có thể lập chỉ mục được gọi là' rez'? Tôi nghĩ rằng điều này cần suy nghĩ lại. –

+0

Ant ... Tôi nghĩ tất cả những gì sai là lập chỉ mục. DefaultModelBinder sẽ cố gắng khớp giá trị đầu vào với thuộc tính của kiểu, 'Rezultat' trong trường hợp này, nhưng nó rất nhạy cảm với các chỉ mục được chỉ định. Họ phải bắt đầu từ 0 và phải tiếp giáp. –

+0

Tôi không đồng ý rằng đó là vấn đề. Giải pháp của bạn ngụ ý rằng anh ta đang cố gắng chuyển 'Rezultat.x [0]' qua 'Rezultat.x [n-1]', khi đọc cẩn thận câu hỏi thì rõ ràng - như chi tiết câu trả lời của tôi - rằng anh ta thực sự muốn chuyển 'Mô hình [0] .x' đến' Mô hình [n-1] .x', trong đó 'Mô hình' là một 'IEnumerable '. –