2016-11-28 22 views
0

MVC Webアプリケーションを構築していて、壁に頭を抱えようとしています。これについてはすでに十数のトピックがあり、私にとってはうまくいきません。おそらく、私は忘れている/見ていない、実際には愚かでシンプルなものがありますが、それをうまくいくようには見えません。 名前を付けて私を憎んではいけません。私は他の誰かによって開始されたプロジェクトを続けています。これは整数であるプロパティModel.ChecklistWaarde.SoortID、に基づいて選択ボックスを作成しますDropDownListFor値をあらかじめ選択していない

@Html.DropDownListFor(m => m.ChecklistWaarde.SoortID, Model.ChecklistOptionsOptions, "Choose a value", new { @class = "form-control" }) 

は、私は私のManageDetail.cshtmlに次の行を持っています。渡された次のパラメータは、モデルからのSelectListであり、2番目のデータベース(不幸にも)でDBルックアップを行う次の非常に簡単なヘルパ関数によって生成され、事前選択値を設定するためにパラメータSoortIDも受け取る。

public SelectList GetChecklistOptions(int selectedId = -1) 
    { 
     var soorten = new List<SelectListItem>(); 
     try 
     { 
      using (var connection = new SqlConnection(mssqlConnectionString)) 
      { 
       connection.Open(); 
       SqlCommand command = connection.CreateCommand(); 
       command.CommandText = "Select Naam, ID From ChecklistSoorten"; 
       SqlDataReader reader = command.ExecuteReader(); 
       while (reader.Read()) 
       { 
        var id = reader["ID"] as int?; 
        if (id.HasValue) 
        { 
         soorten.Add(new SelectListItem { Text = reader["Naam"] as string, Value = id.Value.ToString(), Selected = id.Value.Equals(selectedId) }); 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Globals.Log.Error(ex); 
     } 

     return new SelectList(soorten, "Value", "Text");    
    } 

それは、このようなコントローラで呼び出されます:

public ActionResult ManageDetail(int? id) { 
    var model = new MachineDetailsModel(id); 
    model.ChecklistOptionsOptions = sqlDal.GetChecklistOptions(model.ChecklistWaarde.SoortID); 
    return View("ManageDetail", model); 
} 

私は自分のコードをデバッグしようとすると、私はモデルの値が正しく装着されていることがわかります。

  • SoortID
  • Model.ChecklistOptionsOptions私が「2」プロパティSelected = trueを有する値を持つ項目のみが、これは他のすべてのためにfalseであることが判明SelectListを検査すると人口SelectLisトン
  • を有する(int)2の値を有します。
  • フォームがレンダリングされると、値2のアイテムは選択されません。最初のアイテムが選択されます。「値を選択してください」
  • HTMLを検査すると、値2のアイテムが実際に表示されます私が期待していたことに反して、選択されていませんでした(下記のHTMLを参照してください。私はSelectListで選択されたので、項目2の行に「選択された」と表示されると予想しました。

<select class="form-control" data-val="true" data-val-number="The field SoortID must be a number." data-val-required="The SoortID field is required." id="ChecklistWaarde_SoortID" name="ChecklistWaarde.SoortID" style="min-width:100%;"> 
 
      <option value="">Choose a value</option> 
 
\t \t  <option value="1">Item A</option> 
 
\t \t  <option value="2">Item B</option> 
 
\t \t  <option value="3">Item C</option> 
 
\t \t  <option value="4">Item D</option> 
 
\t  </select>

私は何をしないのですか? DropDownListFor()機能に渡すSelectListにあるように、値「2」のアイテムを選択するにはどうすればよいですか?

if (id.HasValue) 
{ 
    soorten.Add(new SelectListItem 
        { 
         Text = reader["Naam"] as string, 
         Value = id.Value.ToString() 
        }); 
} 

、その後SelectListをインスタンス化のラインでダウン:あなたがそこSelectList、セット選択した値を移入されている場合、あなたのコードは次のようになりコントローラで

+0

モデルをビューに渡す前に、GETメソッドでプロパティ「SoortID」の値を設定する必要があります。また、 'SelectListItem'の' Selected'プロパティを設定するのは無意味です(モデルプロパティへのバインド時に無視されます)。さらに、 'new SelectList(...) 'を使って最初のものから別の' SelectList'を作成しています - 'return soorten;'を使用してください –

+0

@StephenMuecke SoortIDはモデルのコンストラクタで設定されているので景色。 新しいSelectListの代わりにsoortenリストを渡すだけの良い提案は、それを変更します。 –

+0

'SoortID'の値があなたのオプションの1つにマッチすれば、それはビューで選択されます。そうでなければ、あなたに私たちに言っていないことがあります。 –

答えて

0

return new SelectList(soorten, "Value", "Text",selectedId); 

SelectListを削除して、モデルの代わりにChecklistOptionsOptionsタイプをList<SelectListItem>に変更してください。その場合、SelectListの最終行はrになりませんあなたはそれを何度も作成しています。

+0

実際、セレクタのコンストラクタに4番目のパラメータとしてselectedIdを渡すのではなく、SelectListItem自体に対して、そしてStephen Mueckeが述べたように、Selectedを設定します。 SelectListのコンストラクタに渡すために私のコードを変更すると動作します - ありがとう! –

0

最終的には、レンダリングされるビュー内のすべてがViewDataから発生します。これはモデルを取りますが、データと 'ModelState'も要求します。

一部のリクエストパラメータにモデルパラメータの名前と名前が矛盾する場合、この種の問題が発生しました。これにより、モデルの値が上書きされ、問題が発生します。

通常、正しい値がすべて設定されているように見えるので、デバッグは非常に困難です。不確かな場合は、すべてのパラメータ名を確認してください。

関連する問題