2012-12-19 15 views
5

Đây là kịch bản của tôi.Giá trị sử dụng phần mở rộng HTML khác với giá trị được cho là nếu hai mô hình có thuộc tính có cùng tên

  1. Created hai mô hình có một tên tài sản chung

    public class SimpleModel1 
    { 
    // Some Properties 
    
    public string Property1 { get; set; } 
    
    } 
    
    public class SimpleModel2 
    { 
    // Some Properties 
    
    public string Property1 { get; set; } // Same name as Property1 in SimpleModel1 
    
    } 
    
  2. Dùng SimpleModel1 trong một hành động (cho ví dụ Index) trả về một cái nhìn trông như thế này

    @model MvcApplication2.Models.SimpleModel1 
    
    @{ 
    ViewBag.Title = "Home Page"; 
    } 
    
    @using (Html.BeginForm("Test", "Home", FormMethod.Post)) 
    { 
        <label>Enter something here</label> 
        @Html.TextBoxFor(m => m.Property1) 
        <button type="submit">Submit</button> 
    } 
    
  3. Đã gửi giá trị cho hành động Kiểm tra nhận SimpleModel1 làm tham số, một số hoạt động và trả về một lượt xem trong SimpleModel2

    public ActionResult Test(SimpleModel1 model) 
    { 
        SimpleModel2 newModel = new SimpleModel2(); 
    
        // Do Something 
    
        newModel.Property1 = "Something different than model's Property1"; 
    
        return View(newModel); 
    } 
    
  4. Các Test.cshtml (xem trả về bởi hành động Test) là như sau:

    @model MvcApplication2.Models.SimpleModel2 
    
    @{ 
        ViewBag.Title = "Test"; 
    } 
    
    <h2>Test</h2> 
    
    @* Model Propery without using HTML extension*@ 
    @Model.Property1 
    
    @* Model property using HTML extension (Incorrect) *@ 
    
    @Html.TextBoxFor(m => m.Property1) 
    @Html.HiddenFor(m => m.Property1) 
    @Html.TextAreaFor(m => m.Property1) 
    
        @* Correct Value *@ 
    <input value="@Model.Property1" /> 
    

Những gì tôi mong đợi là tất cả các giá trị của Property1 sẽ là "Một cái gì đó khác với mô hình của Property1 "như được đặt trong Hành động thử nghiệm. Nhưng nó chỉ ra rằng những người sử dụng phần mở rộng Html (Html.TextBoxFor, Html.HiddenFor vv) có giá trị Property1 đã được đăng lên Test Action. Ví dụ, nếu tôi đăng bài "Thật ngạc nhiên" (Property1 của SimpleModel1) đến Test Action, giá trị của Property1 của SimpleModel2 cũng là "Thật bất ngờ" bất kể tôi đặt nó là gì.

Tôi không biết điều gì đang diễn ra. Trông giống như một lỗi đối với tôi. Có ai có ý kiến ​​gì không?

Trả lời

10

Bạn sẽ thấy hành vi này khi thực hiện POST vì dữ liệu đã đăng tồn tại trong ModelState. Giá trị cho thuộc tính1 sẽ là bất kỳ giá trị nào được đăng cho thuộc tính này. Để xem giá trị mới của bạn, bạn cần phải bao gồm dòng mã này trong thử nghiệm ActionResult của bạn:

ModelState.Clear(); 

Theo nguyên tắc chung chỉ cần nhớ để bao gồm dòng này trong trường hợp bạn đang đăng dữ liệu, sửa đổi nó và cố gắng xem dữ liệu đã sửa đổi trên chế độ xem được trả lại.

+0

Điều này làm việc nhưng tại sao đây lại là vấn đề với các phương pháp mở rộng html? Làm thế nào đến @ Model.Property1 hiển thị giá trị chính xác? –

+0

Phương pháp mở rộng nội bộ html xem xét giá trị trong ModelState để xác định giá trị cho thuộc tính. Đây chỉ là cách chúng được viết. Tôi không thể nói tại sao họ được viết như thế này. Hy vọng rằng người khác có thể. Tôi cũng muốn được biết. – Dmitry

+3

@Dmitry Nếu bạn có một phương pháp đăng thay vì dùng một ViewModel, lấy một vài tham số riêng lẻ hoặc bạn đã sử dụng bộ sưu tập biểu mẫu để truy xuất các giá trị, sau đó trên POST với xác thực không thành công, bạn không phải nhồi một viewmodel mới và thiết lập tất cả các thuộc tính khác nhau từ các phần tử biểu mẫu vì biểu mẫu sẽ được điền tự động từ ModelState. Đối với phần còn lại của chúng tôi bằng cách sử dụng một ViewModel trong tham số POST, nó sẽ trở thành một khó chịu cho ModelState để được ưu tiên hơn xem Model. – AaronLS

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