2013-05-29 8 views
6

私の夢中になるMVCアプリケーションでは、本当に変わったことがあります。 MVCページで、ユーザーが選択された後、ログインはHTML上で「レンダリング」されるべきです。 一度MVCのクレイジープロパティは価値を失います。 Html.HiddenForバグはありますか?

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

の形で

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

とかつての形ではなく二番目のは常に空白のまま。 2つの呼び出しがまったく同じではないにもかかわらず、戻り値が正しくなければならないので、本当に変です。

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); 
     } 
    } 

コードをデバッグしているときに、「レンダリング」フェーズで選択されたログインのみが呼び出され、正しいログインが返されます。

Html.HiddenForにバグはありますか?

+1

クレイジープロパティ... –

答えて

11

これは実際にはHtml.HiddenForのバグ/不具合です。
私の質問を書いている間、この可能性の考えは私の心にしか来なかった。


私はにそれを変更:

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

、それは完全に罰金働いています。

編集:

もう1つのワーキングアラウンドがあります。

Call ModelState.Clear();コントロールのポストアクションで。
このオプションを使用します。

ModelState.Clear(); 

+

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

なぜdownvoteですか?あなた自身を見せてください^^ – Serge

+5

downvoterではありませんが、これは "Html.HiddenForのバグ/不具合"ではないかもしれません。 'ModelState.Clear()'を使用している場合、 'ModelState'に' SelectedLogin'プロパティがある(例えば、コントローラアクションにPOSTされた値)あなたのモデルの価値HTMLヘルパーは、値を選択するときに常に 'Model'を介して' ModelState'を選択します。これは仕様であり、バグではありません。 – JimmiTh

0

私は.cshtmlがページを戻しながら二回実行すると、セカンドランがnullのモデルオブジェクトに問題がで、またこの問題を持っていました。

@Sergeanswerを使用するとHiddenForが修正されますが、この方法では解決できない部分的な問題もありました。

ビューを呼び出すControllerメソッドがViewBagプロパティをセットして、ビュー+モデルを別々にprotected internal ViewResult View(string viewName, object model);で返すという、間欠的な問題であることが判明しました。

私が取り組んでいるプロジェクトでは、これが全面的に行われています。他のコントローラ/ビューではうまく動作します。しかし、私が維持していたものについては、HiddenForのこのヌル問題が起こっていました。

とにかく、コントローラのすべてのViewBagセッターを取り出し、それらをモデルオブジェクトのNotMappedプロパティに移動しました。

これが完了すると、HiddenForコールなどがすべて再び動作し始めました。ですから、ViewBagとViewModelの子供を混在させないでください。

関連する問題