2017-12-07 7 views
0

@ Html.DropDownListForを作成し、それをデータベースから取り込みます。選択した値をドロップダウンに設定するにはどうすればよいですか?Html.DropDownListFor選択した値を設定します

マイビュー:

@Html.DropDownListFor(m => m.Forms, new SelectList(Model.Forms, "FormsCreatorID", "FormName"), 
      "Select a Form", new { @class = "form-control" }) 

マイコントローラー:

var forms = db.formscreators.Where(fp => fp.PropertyID == id || fp.PropertyID == 0) 
      .OrderByDescending(x => x.PropertyID).GroupBy(x => x.FormName).Select(x => x.FirstOrDefault()).ToList(); 
var viewModel = new ListFormsCreator { Forms = forms }; 

私のViewModel:

public class ListFormsCreator 
{ 
    public List<formscreator> Forms { get; set; } 
} 

私のデータベースモデル:

public partial class formscreator 
{ 
    public int FormsCreatorID { get; set; } 
    public string FormName { get; set; } 
    public int PropertyID { get; set; } 
} 

おかげ

答えて

1

は、あなたが選択したオプションを渡す/ストアのビューモデルに別のプロパティを追加する必要がありますする必要はありません。

public class ListFormsCreator 
{ 
    public int SelectedFormId { set;get;} 
    public List<formscreator> Forms { get; set; } 
} 

は、今すぐあなたのGETアクションで、あなたは

var viewModel = new ListFormsCreator() { Forms = forms }; 
viewModel.SelectedFormId = 2 ; // This will select the option with 2 as FormsCreatorID 
return View(viewModel); 

その値を設定することができ、ビューにDropDownListForヘルパーメソッドの最初のパラメータとして、そのプロパティを持つラムダ式を使用します。

@model ListFormsCreator 

@Html.DropDownListFor(m => m.SelectedFormId , 
         new SelectList(Model.Forms, "FormsCreatorID", "FormName"), 
         "Select a Form", new { @class = "form-control" }) 

DropDownListForヘルパーメソッドは、SelectedFormIdプロパティの値を使用し、そのSELECT要素のオプションのリストから同じvalue属性値を持つオプションを選択します。また、あなたのGETアクションで今すぐSelectListItem

public class ListFormsCreator 
{ 
    public int SelectedFormId { set;get;} 
    public List<SelectListItem> Forms { get; set; } 
} 

のリストでそれを置き換えることで、ビューモデルからformscreatorクラスの依存関係を削除することができ

、あなたはのlsitを生成するSelectメソッドを使用することができます他のコレクションのSelectListItemsomeCollectionと仮定すると

var viewModel = new ListFormsCreator(); 
viewModel.Forms = someCollection.Select(a=>new SelectListItem { 
              Value=a.FormsCreatorId.ToString(), 
              Text=a.FormName}) 
       .ToList(); 
viewModel.SelectedFormId = 2 ; // This will select the option with 2 as FormsCreatorID 
return View(viewModel); 

は、ビューのコードで今すぐformscreatorオブジェクト のコレクションです

@Html.DropDownListFor(m => m.SelectedFormId, Model.Forms ,"Select a Form") 
+1

です。ありがとうございました! – user6824563

1
  1. は、C#/。NETの命名規則に準拠:。
    1. formscreator
    2. FormsCreatorに名前を変更します(これは省略形ではなく、initialismだとして) IdIDを交換し
    3. 名前の変更ListFormsCreatorListFormsCreatorViewModelのようなものなので、それはViewModel型であり、Model/Entity型ではないことは明らかです。
  2. は、選択したFormsCreatorId値を格納するプロパティを追加するためにあなたのViewModelを変更します。必要に応じて値がどうあるべきかを知っていれば、あなたのコントローラのアクションにSelectedFormsCreatorIdプロパティの値を設定し

    public class ListFormsCreatorViewModel 
    { 
        [Required] // add or remove the 'Required' attribute as necessary 
        public int? SelectedFormsCreatorId { get; set; } 
    
        ... 
    } 
    
  3. 。あなたPOSTハンドラで

  4. SelectedFormsCreatorId値を直接通過modelアクションパラメータバックView(Object viewModel)方法を通して、または手動で再増殖のいずれかによって、維持されていることを確認します。

  5. DropDownListForのビューモデルプロパティはSelectedFormsCreatorIdプロパティである必要があります。あなたはnew SelectList(...)

    @Html.DropDownListFor(m => m.SelectedFormsCreatorId, this.Model.Forms); 
    
0

があなたのViewModelを更新し、ドロップダウン選択した値のためのInt SelectIdを追加はるかに簡単です。あなたは「SelectListItemを生成する必要があります

@Html.DropDownListFor(m => m.PropertyId, Model.forms, "Select a Form", new { @class = "form-control", required = "required" }) 
1

public static SelectList FormSelectList(IEnumerable<formscreators> types, string selected = null) 
    { 
     return new SelectList(from f in forms 
           select new SelectListItem 
           { 
            Text = f.FormName, 
            Value = f.FormsCreatorID.ToString() 
           }, "Value", "Text", selected); 

    } 

そして、あなたの.cshtmlに:私は、リストを渡して関数を作成します

var viewModel = new ListFormsCreator { SelectId = PropertyId, Forms = FormSelectList(forms, PropertyId.ToString()) }; 

:あなたのコントローラで

'リストを設定し、ViewBagまたはViewModelで渡します。私のサンプルでは、​​簡単にするためにViewBagを使用しました。ここ が短縮コントローラーです:ここでは

public ActionResult Edit(int? id) 
{ 
    if (id == null) 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 

    Album album = context.Albums.Find(id); 

    if (album == null) 
    { 
     return HttpNotFound(); 
    } 

    ViewBag.GenreId = context.Genres.Select(
     g => new SelectListItem() 
     { 
      Value = g.GenreId.ToString(), 
      Text = g.Name, 
      Selected = g.GenreId == album.GenreId ? true : false 
     }).ToList(); 

    return View(album); 
} 

短縮コードの表示

は非常によく説明し
@using MvcMusicStore2017.Models; 
@model Album 
@Html.DropDownList("GenreId", null, new { @class = "form-control" }) 
関連する問題