2009-06-04 37 views
5

Tôi có một ứng dụng thử nghiệm đơn giản:Html.TextBox có sử dụng Request.Params thay vì Model không?

mẫu:

public class Counter 
{ 
    public int Count { get; set; } 

    public Counter() 
    { 
     Count = 4; 
    } 
} 

Bộ điều khiển:

public class TestController : Controller 
{ 
    public ActionResult Increment(Counter counter) 
    { 
     counter.Count++; 
     return View(counter); 
    } 
} 

Xem:

<form action="/test/increment" method="post"> 
    <input type="text" name="Count" value="<%= Model.Count %>" /> 
    <input type="submit" value="Submit" /> 
</form> 

Nhấp Gửi tôi nhận được giá trị như:

5, 6, 7, 8, ...

Với Html.TextBox tôi mong đợi những hành vi tương tự

<form action="/test/increment" method="post"> 
    <%= Html.TextBox("Count") %> 
    <input type="submit" value="Submit" /> 
</form> 

nhưng thực sự có

5, 5, 5, 5.

Có vẻ như Html.TextBox sử dụng Request.Params thay vì Mô hình?

Trả lời

8

Html.TextBox() sử dụng phương thức ViewData.Eval() nội bộ lần đầu tiên tìm cách lấy giá trị từ từ điển ViewData.ModelState và tiếp theo để truy lục giá trị từ thuộc tính của ViewData.Model. Điều này được thực hiện để cho phép khôi phục các giá trị đã nhập sau khi gửi biểu mẫu không hợp lệ.

Xóa giá trị Đếm khỏi Chế độ xem.Từ điển ModelState giúp:

public ActionResult Increment(Counter counter) 
{ 
    counter.Count++; 
    ViewData.ModelState.Remove("Count"); 
    return View(counter); 
} 

Một giải pháp khác là làm cho hai phương pháp khác nhau điều khiển cho GET và POST hoạt động:

public ActionResult Increment(int? count) 
{ 
    Counter counter = new Counter(); 

    if (count != null) 
     counter.Count = count.Value; 

    return View("Increment", counter); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Increment(Counter counter) 
{ 
    counter.Count++; 

    return RedirectToAction("Increment", counter); 
} 

đối tượng Counter cũng có thể được truyền qua từ điển TempData.

Bạn cũng có thể quan tâm đến bài viết Repopulate Form Fields with ViewData.Eval() bởi Stephen Walther.

+0

Cảm ơn bạn, Alexander! – alex2k8

+0

Vậy tại sao xác định một cách rõ ràng Model.Count không hoạt động? <% = Html.TextBox ("Count", Model.Count)%> –

+1

Vì lúc đầu Html.TextBox() lấy giá trị từ từ điển ModelState. –

0

Html.TextBox có nhiều tham số hơn tham số one..first là tên hoặc id của yếu tố đầu vào, và điều thứ hai là giá trị ...

để viết helper textbox của bạn như thế này:

<%= Html.TextBox("Count",Model.Count) %> 

cổ vũ

+3

này không làm việc cũng :-( – alex2k8

1

Đó không phải là vấn đề ở đây. Xác định

<%= Html.TextBox("Count") %> 

tương đương với việc xác định

<%= Html.TextBox("Count", null) %> 

mà sẽ kéo giá trị phù hợp (có tên là "Đếm") từ ModelStateDictionary.

Nhưng ngay cả như vậy, rõ ràng đi qua trong

<%= Html.TextBox("Count", Model.Count) %> 

kết quả trong hành vi tương tự được mô tả bởi alex2k8.

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