2017-11-19 5 views
1

私はこのコースに従います。インストラクターはレコードをDBに追加するコードを追加しました。 DBに追加することになるだろうクラスは次のようになります。フィールドは必須です。フィールドを記入した後でさえ - Validation

public class Gig 
    { 
    public int Id { get; set; } 

    public ApplicationUser Artist { get; set; } 

    [Required] 
    public string ArtistId { get; set; } 

    public DateTime DateTime { get; set; } 

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

    public Genre Genre { get; set; } 

    [Required] 
    public byte GenreId { get; set; } 
} 

とマッピングを行うには、ビューに取り付けられており、それはこのようになりますビューモデルがあります:

public class GigFormViewModel 
    { 

    [Required] 
    public string Venue { get; set; } 

    [Required] 
    [FutureDate] 
    public string Date { get; set; } 

    [Required] 
    [ValidTime] 
    public string Time { get; set; } 

    [Required] 
    public byte Genre { get; set; } 

    [Required] 
    public IEnumerable<Genre> Genres { get; set; } 

    public DateTime GetDateTime() => DateTime.Parse($"{Date} {Time}"); 
} 

私は、フォームフィールドを取得し、作成する方法を、持っている、とモデル自体にビューモデルからマッピングを行い、その後、DBにレコードを追加しようとすると、私の作成アクションは次のようになります。オン

[Authorize] 
    [HttpPost] 

    public ActionResult Create(GigFormViewModel viewModel) 
    { 
     viewModel.Genres = _context.Genres.ToList(); 

     if (!ModelState.IsValid) 
     { 
      return View(viewModel); 
     } 

     var gig = new Gig() 
     { 

      GenreId = viewModel.Genre, 
      ArtistId = User.Identity.GetUserId(), 
      DateTime = viewModel.GetDateTime(), 
      Venue = viewModel.Venue 
     }; 

     _context.Gigs.Add(gig); 
     _context.SaveChanges(); 


     return RedirectToAction("Index", "Home"); 
    } 

ス私はviewModelのプロパティGenresを取得し、DBからのレコードでそれを設定し、次にModelState.IsValidをチェックします。しかし、それは私を与えている:私はちょうど2行以上に設定しますが

ジャンルフィールドは

が必要です。

ここに何か問題がありますか?どんな指導も高く評価されます。

ありがとうございました。

答えて

1

ビューモデルのGenresプロパティに検証データ注釈を追加する必要はありません。ユーザーが設定したデータではないため、ビューがGenreのコレクションを取得するために設定されているためです。ドロップダウンリストのようなものを設定します。

最初にGenresプロパティをGigFormViewModelに飾る[Required]属性を削除します。

[Authorize] 
[HttpPost] 
public ActionResult Create(GigFormViewModel viewModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     // re-populate Genres collection only is tha data is in invalid state. 
     viewModel.Genres = _context.Genres.ToList(); 
     return View(viewModel); 
    } 

    // The remainder code does not change 
} 
+1

恐ろしい: 第二に、あなたのアクションメソッドは、以下のような特別if圏をリファクタリング。ヒントをありがとう! – brittany

+0

ようこそ。 – CodeNotFound

+0

さらに、私のフォームを保存しようとしたとき、DateTime.Parse($ "{Date} {Time}")のエラーが発生しました。データは正しい形式ではありません: "18/11/2017 "、時間は" 2:35 "です。これに何が間違っているのか教えてください。ありがとうございました。 – brittany

関連する問題