2013-05-29 2 views
6

Có điều gì đó thực sự kỳ lạ xảy ra trong ứng dụng MVC khiến tôi phát điên. Trên trang MVC của tôi, sau khi người dùng được chọn, đăng nhập của nó phải được "hiển thị" hai lần trên HTML. Khi theo hình thứcMVC tài sản điên mất giá trị của nó. Html.HiddenFor có lỗi không?

FrmNextStep('<Login>', ... 
(where Model.SelectedUser.Login is used) 

và một lần theo hình thức

<input id="SelectedLogin" name="SelectedLogin" value="<Login>" type="hidden"> 
(where "Model".SelectedLogin is used) 

nhưng điều thứ hai luôn luôn trống. Nó thực sự kỳ lạ bởi vì, mặc dù hai cuộc gọi không được chính xác như nhau, giá trị trả lại nên được.

if (Model.SelectedUser != null) 
{ 
    <span>Some value</span> 
    <script type="scriptADResultComplete"> 
    @{ 
     var script = String.Format(
      @"FrmNextStep('{0}', '{1}', '{2}');" 
      , Model.SelectedUser.Login.Replace("'", @"\'") 
      , Model.SelectedUser.FirstName.Replace("'", @"\'") 
      , Model.SelectedUser.LastName.Replace("'", @"\'") 
     ); 

     @Html.Raw(script); 
    } 
    </script> 
} 

<input type="hidden" name="hfAction" /> 
<input type="hidden" name="hfUserLogin" /> 
@Html.HiddenFor(m => m.CurrentPage, new { id = "hfCurrentPage" }) 
@Html.HiddenFor(m => m.SelectedLogin); 


    private User selectedUser; 
    public User SelectedUser 
    { 
     get 
     { 
      if (this.selectedUser == null) 
      { 
       this.selectedUser = this.AllUsers.FirstOrDefault(user => user.Selected) ?? User.DefaultUser; 
      } 

      if (this.selectedUser == User.DefaultUser) 
      { 
       return null; 
      } 

      return this.selectedUser; 
     } 
     set 
     { 
      this.AllUsers.ForEach(user => user.Selected = (user == value)); 

      this.selectedUser = null; 
     } 
    } 

    public string SelectedLogin 
    { 
     get 
     { 
      return (this.SelectedUser ?? User.DefaultUser).Login; 
     } 
     set 
     { 
      this.SelectedUser = this.AllUsers.FirstOrDefault(user => user.Login == value); 
     } 
    } 

Và khi tôi gỡ lỗi mã, lệnh gọi duy nhất để đăng nhập được chọn trong giai đoạn "hiển thị" và trả lại thông tin đăng nhập chính xác.

Có lỗi nào với Html.HiddenFor không?

+1

Tài sản bất động sản ... –

Trả lời

11

Ok, đó thực sự là hành vi lỗi/lỗi của Html.HiddenFor.
Ý tưởng về khả năng này chỉ xuất hiện trong tâm trí tôi khi tôi đang viết câu hỏi của mình.


tôi đã thay đổi nó thành:

<input type="hidden" value="@Html.AttributeEncode(Model.SelectedLogin)" id="SelectedLogin" name="SelectedLogin" /> 

và nó làm việc hoàn toàn tốt đẹp.

CHỈNH SỬA:

Có một nơi làm việc khác.

Gọi ModelState.Clear(); trong hoạt động của người kiểm soát bài đăng.
Tôi sẽ sử dụng tùy chọn này.

ModelState.Clear(); 

+

@Html.HiddenFor(m => m.SelectedLogin) 
+2

Tại sao bạn phải trả tiền? Thể hiện bản thân mình, hater ^^ – Serge

+5

Không phải là downvoter, nhưng lý do có thể là đây không phải là "hành vi lỗi/lỗi của Html.HiddenFor". Nếu sử dụng 'ModelState.Clear()' hoạt động, có vẻ như có khả năng (không thể nói từ mã của bạn) rằng có một thuộc tính 'SelectedLogin' trong' ModelState' của bạn (ví dụ: một giá trị được gửi tới hành động điều khiển), khác với giá trị trên mô hình của bạn. Người trợ giúp HTML sẽ luôn chọn 'ModelState' trên' Mô hình' khi chọn giá trị. Điều này là do thiết kế, không phải là một lỗi. – JimmiTh

0

Tôi có vấn đề này cũng có, với .cshtml thực hiện hai lần trong khi quay trở lại trang, và chạy thứ hai gặp vấn đề với đối tượng mô hình null.

Sử dụng @Serge 's answer sửa lỗi HiddenFor' s, nhưng sau đó tôi cũng gặp vấn đề với partials không thể được giải quyết theo cách này.

Nó hóa ra là một vấn đề không liên tục, trong đó phương pháp Controller gọi chế độ xem đang đặt ViewBag thuộc tính cùng với trả lại chế độ xem + mô hình riêng biệt qua protected internal ViewResult View(string viewName, object model);.

Dự án tôi đang làm việc trên tất cả các nơi này và trên các bộ điều khiển/chế độ xem khác hoạt động tốt. Nhưng đối với cái tôi đang duy trì, vấn đề vô giá trị trong số HiddenFor đang diễn ra.

Dù sao, tôi đã kéo tất cả các bộ định vị ViewBag ra khỏi bộ điều khiển và di chuyển chúng vào các thuộc tính NotMapped trên đối tượng mô hình.

Khi việc này được thực hiện, các cuộc gọi HiddenFor, v.v. tất cả bắt đầu hoạt động trở lại. Vì vậy, đừng trộn ViewBag và trẻ em ViewModel của bạn.