2009-05-07 48 views
5

Tôi gặp sự cố khi xén lên dưới dạng tôi đang cố đăng. Trong trường hợp biểu mẫu không xác thực, tôi đang sử dụng tuyến đường tiêu chuẩn gọi số ModelState.AddModelError() rồi trả lại kết quả Xem.ASP.Net MVC ModelState/Html.Tài liệu postback postback

Vấn đề là người trợ giúp HTML. * Được coi là nhận giá trị được đăng khi hiển thị và tôi nhận thấy rằng trường văn bản của tôi CHỈ làm như vậy nếu tôi đưa chúng vào danh sách tham số của hành động postback. không được yêu cầu nhìn thấy như một số hình thức có quá nhiều lĩnh vực để muốn liệt kê tất cả chúng như các tham số.

mã hành động của tôi là khoảng:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditDataDefinition(long? id, string name) 
{ 
    var dataDefinition = ... 

    // do some validation stuff 
    if (!ModelState.IsValid) 
    { 
     // manually set checkbox fields via ViewData seeing as this STILL doesn't work in MC 1.0 :P 
     // ... 
     return View(dataDefinition); 
    } 

} 

Bây giờ, dataDefinition (mà là một LINQ to thực thể SQL) có một trường MinVolume, được xử lý trong giao diện của dòng này:

Minimum: <%= Html.TextBox("MinVolume", null, new { size = 5 })%> 

Tuy nhiên, khi chế độ xem được hiển thị sau khi xác thực ModelState không thành công, giá trị được nhập vào trang gốc mà chúng tôi đã đăng không được bảo toàn KHÔNG GIỚI THIỆU Tôi đưa nó vào làm tham số trong phương thức postback. Theo nghĩa đen, tôi có thể "giải quyết vấn đề" bằng cách thực hiện việc này:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditDataDefinition(long? id, string name, string minVolume) 

Vì một lý do nào đó sẽ buộc giá trị trường phải được giữ nguyên. Điều này có vẻ ngu ngốc với tôi bởi vì hình thức của tôi có nhiều giá trị hơn cách đó và tôi không cần phải thêm một tham số cho trường đó.

Bất kỳ ý tưởng nào?

Trả lời

4

Nó có thể được rằng mã của bạn:

<%= Html.TextBox("MinVolume", null, new { size = 5 })%> 

..has các null cho param Giá trị mặc định? Có thể nếu bạn thay đổi null thành Model.MinVolume, giá trị này sẽ tiếp tục tồn tại. Như thế này:

<%= Html.TextBox("MinVolume", Model.MinVolume, new { size = 5 })%> 

Tôi không chắc liệu hành động của bạn có trả về giá trị MinVolume trong mô hình tho hay không.Nếu có, điều trên sẽ hoạt động. Khác, bạn có thể cần phải tái cấu trúc hành động một chút.

+0

Không, chỉ định null là nghĩa vụ phải xác định rằng bối cảnh mô hình hiện tại nên được sử dụng để truy vấn giá trị. Chỉ định MinVolume rõ ràng và sẽ buộc giá trị đó được sử dụng thay cho giá trị đã được gửi trước đây. –

+0

Không đúng. Chỉ định MinVolume tra cứu ViewDataDoctionary và sau đó là ModelStateDictionary cho các bài viết tiếp theo. Vì vậy, nếu Model.MinVolume là nói 5 vì chỉnh sửa, sau đó chỉ định MinVolume sẽ đặt 5 vào TextBox. Sau đó, nếu một bài viết được thực hiện (nói giá trị 3) nhưng tìm thấy không hợp lệ thì TextBox sẽ hiển thị 3 vòng 2 lần. Bạn đã thử chưa? Bạn thường chỉ định null trên chế độ xem 'Mới' hoặc 'Tạo' để bài đăng đầu tiên hiển thị trống trong trường và các bài đăng tiếp theo vẫn tiếp tục giá trị đã nhập. –

+0

Đây chính xác là cách tôi làm điều đó và làm việc mọi lúc. Tôi không bao giờ thấy bất cứ nơi nào mà bạn phải chỉ định null. Một liên kết đến nơi bạn thấy sẽ tốt. – sirrocco

3

Chìa khóa bạn đang sử dụng khi bạn đặt giá trị trong ModelState do lỗi là gì? Mã đặt tham số giá trị cho một TextBox trông giống như:

Phần có liên quan của downloaded framework code.

string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string)); 
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue); 

Như bạn có thể thấy nếu giá trị cố gắng tồn tại, nó sẽ sử dụng nó - nhưng chỉ khi có cùng một khóa. Tôi biết rằng điều này làm việc bởi vì tôi có một hành động mà không có tham số và nhận được các giá trị trực tiếp từ ValueProvider và nó sử dụng AddModelError để chỉ ra các lỗi xác nhận hợp lệ. Tôi chắc chắn rằng các giá trị trong TextBox của tôi được giữ lại.

EDIT: Để các giá trị được giữ lại, chúng cần được liên kết với mô hình theo một cách nào đó. Một cách để làm điều này là thêm chúng vào danh sách tham số. Một cách khác là sử dụng UpdateModel (với tên tham số trong danh sách trắng hoặc không có danh sách trắng). Cách thứ ba là thêm tham số một cách rõ ràng vào mô hình như trong câu trả lời của @ Jenea. Vì người trợ giúp chỉ kéo từ trạng thái mô hình, họ phải ở trong đó để các giá trị được giữ lại. Nó không xem xét thuộc tính biểu mẫu của yêu cầu.

+0

lĩnh vực đó không được xác nhận không cần phải ở giai đoạn này. Do đó nó chỉ là một "người ngoài cuộc vô tội" trong biểu mẫu và hy vọng sẽ có giá trị mới của nó được bảo tồn nếu một trong các trường khác không hành xử và do đó làm cho biểu mẫu hiển thị lần thứ hai. –

+0

Tôi tự hỏi tất cả của một bất ngờ nếu tôi không chính xác làm cho giả định rằng ModelState nên cố gắng để bảo toàn tất cả các lĩnh vực có tên phù hợp với mô hình. Có lẽ nó chỉ bảo tồn các trường được chuyển qua thông qua danh sách tham số hoặc được tham chiếu qua AddModelError? Nếu đúng như vậy, có vẻ như tôi thấy là ngu ngốc khi tôi muốn bảo toàn mọi thứ trong mẫu, chứ không phải chỉ những trường hợp cụ thể. Sau đó, một lần nữa, MVC vẫn không giữ gìn đúng cách các hộp kiểm ... –

0

Theo tôi được biết giải pháp là:

[Transaction] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditDataDefinition(int id, FormCollection form) 
{ 
    T itemToUpdate = repository.Get(id); 
    UpdateModel(itemToUpdate, form.ToValueProvider()); 

    if (itemToUpdate.IsValid()) 
    { 
     repository.SaveOrUpdate(itemToUpdate); 
     return Json(ValidationResultToJson(itemToUpdate.ValidationResults())); 
    } 

    repository.DbContext.RollbackTransaction(); 
    return Json(ValidationResultToJson(itemToUpdate.ValidationResults())); 
} 

chúc may mắn!

6

Oh người đàn ông tôi vừa cải thiện thiết kế ứng dụng của mình. Sự cố xảy ra do bạn có xác thực tùy chỉnh (tôi cũng có). Bạn phải thêm sau

ModelState.AddModelError() 

này

ModelState.SetModelValue("MinVolume", ValueProvider["MinVolume"]); 

Theo quan điểm đó phải là

Mimum:<%=Html.Textbox("MinVolume")%> 

Vẫn không chắc chắn lý do tại sao nó hoạt động nhưng nó làm việc cho tôi.

+0

oooh ... đây có thể là câu trả lời! sẽ kiểm tra vào buổi sáng khi tôi đi làm. cảm ơn. –

+2

Nó hoạt động vì nó thêm giá trị cho mô hình, từ đó người trợ giúp kéo các giá trị. Sử dụng UpdateModel cũng sẽ hoạt động, cái mà tôi sử dụng và tại sao giá trị hộp văn bản của tôi đang được giữ nguyên. – tvanfosson

0

Một giải pháp khác là nếu bạn gõ vào xem:

<%var minVolume=Request["MinVolume"]??"";%> 
<%=Html.Textbox("MinVolume",minVolume,new {size=5})%> 
0

hãy tham khảo bài viết này để xem cách khác nhau để xử lý postback trong ASP.NET MVC

link text

+0

Bài viết hay cho bộ khởi động. –

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