2016-07-27 23 views
1

私はASP.NET Core 1.0とEF Core 1.0を使用していて、SQLデータベースに次のコードファーストクラスを持っています。私もこのコントローラをしているSQLデータベーステーブルのデータを使用してRazorにSelectタグヘルパーを設定する方法

namespace GigHub.ViewModels 
{ 
    public class GigFormViewModel 
    { 
    public string Venue { get; set; } 
    public string Date { get; set; } 
    public string Time { get; set; } 
    public List<Genre> Genres { get; set; } 
    } 
} 

::私は私のカミソリビューは、に設定している

using GigHub.Data; 
using GigHub.ViewModels; 
using Microsoft.AspNetCore.Mvc; 

namespace GigHub.Controllers 
{ 
    public class GigsController : Controller 
    { 
    private readonly ApplicationDbContext _context; 

    public GigsController(ApplicationDbContext context) 
    { 
     _context = context; 
    } 
    public IActionResult Create() 
    { 
     var vm = new GigFormViewModel(); 

     // Need to get my Genre list from the DbSet<Genre> in my database context injected above 
     // into the GigFormViewModel for the Select taghelper to consume 

     return View(vm); 
    } 
    } 
} 

namespace GigHub.Models 
{ 
    public class Genre 
    { 
    public byte Id { get; set; } 

    [Required] 
    [StringLength(255)] 
    public string Name { get; set; } 
    } 
} 

また、私はカミソリビューのフォームで使用する次のViewModelクラスを持っていますViewModelをうまく使用してください。ただし、Genreプロパティにアクセスするには、以下のSelect taghelperコードをどのように設定するべきかはっきりしていません。

<div class="form-group"> 
     <label asp-for="????" class="col-md-2 control-label"></label> 
     <div class="col-md-10"> 
     <select asp-for="????" asp-items="????" class="form-control"></select> 
     <span asp-validation-for="????" class="text-danger" /> 
     </div> 
    </div> 

私は基本的に選択taghelper ASP-項目は=が消費できるという形でのViewModelプロパティに私のデータベースからジャンルの私のリストを取得する方法をgrokkingトラブルを抱えています。多くのトライアル&私は一般的な変換の問題が発生した結果、一般的なのリスト<のタイプにMVCの種類から行くエラーcontortions。私はViewModelのGenreクラスを調整する必要があると思っていますが、これまでの研究では以前のバージョンのASP.NETとEntity Frameworkをカバーする記事しかなく、ASP.NET Core 1.0 RC2とEF Core 1.0にマッピングするのに苦労しました。

+0

'<選択ASP-用=「フィールド名」ASP-項目=「ViewBag.OptionsCollection」>' –

+0

に沿っtaghelperためViewBagを回避し、リスト形式へのViewModelからリストを取得する方法はありませんasp-items = "Model.MyGenreListHere"の行? これは私が間違っている場所ですか? –

+0

ViewModelでフィールドを使用するだけです。 ASP.NETのドキュメントから例を投稿します。 –

答えて

1

asp-forを使用して、選択要素のモデルプロパティ名を指定し、asp-itemsを使用してオプション要素を指定することができます。あなたはモードに提出SomeOptionsを追加したくない場合は

<select asp-for="SomeFiles" asp-items="Model.SomeOptions"></select> 

またViewBag.SomeOptionsを使用することができます。

詳細については、The Select Tag Helperのマニュアルを参照してください。

ビュー

<select asp-for="Country" asp-items="Model.Countries"></select> 

モデル

using Microsoft.AspNetCore.Mvc.Rendering; 
using System.Collections.Generic; 

namespace FormsTagHelper.ViewModels 
{ 
    public class CountryViewModel 
    { 
     public string Country { get; set; } 

     public List<SelectListItem> Countries { get; set; } 
    } 
} 

コントローラ

IndexメソッドはCountryViewModelを初期化し、選択した国と国のリストを設定し、モデルをIndexビューに渡します。

public IActionResult Index() 
{ 
    var model = new CountryViewModel(); 
    model.Country = "CA"; 
    model.Countries = db.Countries 
         .Select(x => new SelectListItem { Value = x.Id, Text = x.Name }) 
         .ToList(); 

    return View(model); 
} 
+0

私はdocsサイトでもその例を見ていましたが、精神的に私の状況にマップすることはできませんでした。 データベースの私のドメインモデルに私のGenresのリストが既に保存されているので、私のViewModelはtaghelperのためにそれらを 'newing'することでこれらの要素を初期化する必要はありません。 DbContext の値を読み込み、ViewModelのプロパティにマッピングするためにデータベースコンテキストを使用するように私のコントローラで期待していましたが、変換の問題を避けるための構文はわかりません。 –

+0

編集した回答を確認してください。上記の例のように、テーブルのデータを 'List 'に変換するだけで済みます。 –

+0

素晴らしいそれはうまくいくと思われ、私を軌道に戻しました。私の「Linq-Fu」がより良いかもしれないようです。知識ギャップを埋めるためにLinqチュートリアルをいくつか追加する必要があるようです。どうもありがとう。 –

関連する問題