2011-01-06 39 views
11

Có thể tôi đang thiếu thứ gì đó nhưng khi tôi có biểu mẫu đăng lại cùng một hành động, giá trị hộp văn bản sẽ chuyển về giá trị cũ. Ví dụ sau sẽ tăng giá trị trong hộp văn bản trên mỗi POST. Điều này không xảy ra, giá trị trên mô hình được tăng lên và mô hình là hợp lệ.Textbox hoàn nguyên về giá trị cũ trong khi Modelstate có giá trị trên postback

NẾU tuy nhiên tôi xóa mô hình trong Hành động HttpPost (chú thích trong mã), mọi thứ hoạt động như mong đợi.

Tôi có thiếu gì đó không?

Dưới đây là các mã:

mẫu:

public class MyModel 
{ 
    public int MyData { get; set; } 
} 

Xem:

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

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<% using (Html.BeginForm()) {%> 
    <%: Html.TextBoxFor(m => m.MyData)%> (<%: Model.MyData%>) 
        <%: Html.ValidationMessageFor(m => m.MyData) %> <br /> 
    State :<%: ViewData["State"] %> <br /> 
    <input type="submit" /> 
<% } %> 
</asp:Content> 

Bộ điều khiển:

public class HomeController : Controller 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     return View(new MyModel { MyData = 0 }); 
    } 

    [HttpPost] 
    public ActionResult Index(MyModel myModel) 
    { 
     // ModelState.Clear(); 
     ViewData["State"] = "invalid"; 
     if (ModelState.IsValid) 
      ViewData["State"] = "Valid"; 

     var model = new MyModel { MyData = myModel.MyData + 1 }; 
     return View(model); 
    } 

} 

Trả lời

8

Tôi vừa tìm thấy câu trả lời cho trực tuyến này.

Bí quyết là để xóa các ModelState trước khi trở Model

[HttpPost] 
public ActionResult Index(MyModel myModel) 
{ 
    // ModelState.Clear(); 
    ViewData["State"] = "invalid"; 
    if (ModelState.IsValid) 
     ViewData["State"] = "Valid"; 

    var model = new MyModel { MyData = myModel.MyData + 1 }; 

    ModelState.Clear(); 

    return View(model); 
} 

Để cụ thể hơn đọc những 2 bài viết

http://forums.asp.net/p/1527149/3687407.aspx

Asp.net MVC ModelState.Clear

+0

Cảm ơn. Tôi biết rằng việc xóa ModelState sẽ hoạt động, tôi không biết tại sao nó phải được thực hiện cho một mô hình hợp lệ. Liên kết đầu tiên có một số nhận xét của Brad Wilson giải thích rằng đây là theo thiết kế, chế độ xem sẽ luôn sử dụng ModelState nếu có, bất kể mô hình có hợp lệ hay không .. Một giải pháp cũng hoạt động là chuyển hướng đến một hành động thay vì trả về xem lại (nguyên nhân sẽ sử dụng ModelState có sẵn). –

+0

Rất cám ơn! Giúp tôi ra ngoài .. Hoạt động tuyệt vời .. – Aaron

+0

Rõ ràng bạn không nên xóa trạng thái mô hình - xem http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc- s-html-helpers-render-the-sai-value.aspx –

2

Bạn có thể nên sử dụng Post-Redirect-Get pattern hoặc không sử dụng Trình trợ giúp Html.

tham khảo: http://blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx

Về cơ bản MVC hy vọng bất kỳ hiển thị lại từ một bài đăng là một lỗi xác nhận, và tái sử dụng dữ liệu đăng (xem ModelState) cho hiển thị lại ưu tiên để mô hình hóa dữ liệu. Hướng dẫn là không phải sử dụng ModelState.Clear().

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