2011-10-21 56 views
9

Tôi đang cố chuyển một biến chuỗi bên trong asp.net MVC. Tôi sử dụng breakpoint vì vậy tôi thấy rằng nó đi đến phương pháp chính xác trong bộ điều khiển, nhưng các biến được đăng bằng null.Truyền các biến với POST trong ASP.NET MVC

đánh dấu của tôi:

@{ 
    ViewBag.Title = "TestForm"; 
} 

<h2>TestForm</h2> 

@using (Html.BeginForm()) { 
    <input type="text" id="testinput" /> 

    <input type="submit" value="TestForm" /> 
} 

điều khiển của tôi:

public ActionResult TestForm() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult TestForm(string testinput) 
{ 
    Response.Write("[" + testinput + "]"); 

    return View(); 
} 

tôi đặt breakpoint trong phương pháp TestForm thứ hai và testinput là null .... Tôi có thiếu cái gì?

Lưu ý: Tôi nhận thấy rằng hầu hết thời gian tôi sẽ sử dụng mô hình để truyền dữ liệu xung quanh, nhưng tôi muốn biết rằng tôi cũng có thể vượt qua chuỗi.

Là một phần của cùng một câu hỏi, làm cách nào để chuyển một số biến? Phương thức trong trình điều khiển của tôi có trông giống như sau:

[HttpPost] 
public ActionResult TestForm(string var1, var2) 
{ 
} 

Trả lời

18

Đối với tôi, có vẻ như bạn đặt id không phải là tên. Tôi sử dụng MVC3 mỗi ngày, vì vậy tôi không sao chép mẫu của bạn. (Tôi thức cho 20 giờ lập trình;) nhưng vẫn còn có động lực để giúp đỡ) Xin vui lòng cho tôi biết nếu nó không hoạt động. Nhưng đối với tôi, có vẻ như bạn phải đặt thuộc tính "name" ... không phải là thuộc tính id. Hãy thử rằng ... tôi đang chờ đợi ngay bây giờ để giúp bạn nếu nó không hoạt động.

 <input type="text" id="testinput" name="testinput" /> 
+0

vâng nó làm việc hmmmm!. tại sao MS quyết định dựa vào một tên và không phải là ID ???? tại sao họ luôn luôn làm điều đó ngược ???? Nhưng cảm ơn! – sarsnake

+6

Không, Microsoft thực sự tuyệt vời với mvc, đừng nghĩ về microsoft về điều đó. Về tiêu chuẩn web của nó. Về cơ bản, thuộc tính id được sử dụng để áp dụng javascript (getElementsById, CSS-StyleSheets, jQuery và hơn thế nữa). Thuộc tính tên có liên quan đến các bài đăng và các thứ không đồng bộ (theo hướng dữ liệu). – dknaack

+0

Trong biểu mẫu html thông thường, tôi không bao giờ phải chỉ định thuộc tính tên, id luôn sufficed và các biến được đăng thành công. – sarsnake

1

Trên một lưu ý một chút riêng biệt không có gì sai với các biến qua cũng giống như bạn đang có, nhưng một cách hiệu quả hơn sẽ được vượt qua xung quanh một mô hình quan điểm mạnh mẽ gõ cho phép bạn tận dụng lợi thế của nhiều khía cạnh của sự tốt lành MVC của:

  • quan điểm mạnh mẽ-gõ
  • MVC mẫu Binding
  • Html Helpers

Tạo một mô hình quan điểm mới:

public class TestModel 
{ 
    public string TestInput { get; set; } 
} 

điều khiển thử nghiệm của bạn:

[HttpGet] 
    public ActionResult TestForm() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult TestForm(FormCollection collection) 
    { 
     var model = new TestModel(); 
     TryUpdateModel(model, collection); 

     Response.Write("[" + model.TestInput + "]"); 

     return View(); 
    } 

xem của bạn:

@model <yourproject>.Models.TestModel 

@{ 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 
<head> 
    <title>TestForm</title> 
</head> 
<body> 
    <div> 
     @using(Html.BeginForm()) 
     { 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.TestInput) 
      </div> 
      <div class="editor-label"> 
       @Html.TextBoxFor(m => m.TestInput) 
      </div> 
      <input type="submit" value="Test Form"/> 
     } 
    </div> 
</body> 
</html> 
+1

Nếu bạn đang thuyết giảng về các chế độ xem được nhập mạnh mẽ, tại sao bạn sẽ dựa vào formCollection trong phương thức hành động POST của bạn. Không phải nó là ActionResult TestForm công khai (mô hình TestModel)? – Tommy

+0

Tôi vượt qua một FormCollection như thế này cho mục đích thử nghiệm đơn vị mà không cần mocks. Bài kiểm tra của tôi có thể chuyển một bộ sưu tập biểu mẫu tới cuộc gọi UpdateModel và để nó ánh xạ các giá trị vào đối tượng mô hình TestModel. – Jesse

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