2017-09-14 28 views
0

エンティティフレームワーク7を使用したASP.NETコアアプリケーションがあります。
データアノテーションを使用して、Webサイトのコンテンツを編集するときに警告を表示しています。.NET Core 2.0 EF7データアノテーションに警告が表示されない

入力フィールドとそれぞれの警告スパンをループに追加すると、これは機能しませんでした。
送信をブロックしていますが、警告を表示していません。
何か間違っていますか?

私のコード:
カミソリビュー:

@model Receptenboek.Models.RecipeViewModels.RecipeEdit 
@{ 
    ViewData["Title"] = "Edit"; 
} 
<h2>Edit</h2> 
<h4>Recipe</h4> 
<hr /> 
<div class="row"> 
    <div class="col-md-4"> 
     <form asp-action="Edit"> 
      <div asp-validation-summary="ModelOnly" class="text-danger"></div> 
      <input type="hidden" asp-for="Recipe.ID" /> 
      <input type="hidden" asp-for="Recipe.Ingredients" /> 
      <div class="form-group"> 
       <label asp-for="Recipe.Name" class="control-label"></label> 
       <input asp-for="Recipe.Name" class="form-control" /> 
       <span asp-validation-for="Recipe.Name" class="text-danger"></span> 
      </div> 
      <div class="form-group"> 
       <h3 asp-for="Book" class="control-label">Book</h3> 
       <select asp-for="Recipe.RecipeBookID" asp-items="@(new SelectList(Model.Books, "ID", "BookName", Model.Recipe.RecipeBookID))"></select><br /> 
       <span asp-validation-for="Books" class="text-danger"></span> 
      </div> 
      <div id="fields" class="form-actions"> 

       @foreach (Recipe_Ingredient ri in Model.Recipe.Ingredients) 
      { 
        <div id="IngredientDiv"> 
         <label class="control-label">Ingredient name </label><br /> 
         <select name="ingredients" asp-for="@ri.IngredientID" asp-items="@(new SelectList(Model.Ingredients, "ID", "Name"))"></select><br /> 
         <label class="control-label">Amount </label> 
         <input name="Amount" class="form-control" asp-for="@ri.Amount" asp-route-amounts="@ViewData["amounts"]" /> 
         <span asp-validation-for="@ri.Amount" class="text-danger"></span> 
         <hr /> 
        </div> 
       } 
      </div> 
      <span class="text-danger">@ViewData["Warning"]</span><br/> 
      <a onclick="duplicate()">Add Ingredient</a> 
      <div class="form-group"> 
       <input type="submit" value="Save" class="btn btn-default" /> 
      </div> 
     </form> 
    </div> 
</div> 
<div> 
    <a asp-action="Index">Back to List</a> 
</div> 
@section Scripts { 
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} 
} 

のViewModel:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 

namespace Receptenboek.Models.RecipeViewModels 
{ 
    public class RecipeEdit 
    { 
     public Recipe Recipe { get; set; } 
     public ICollection<Ingredient> Ingredients { get; set; } 
     public ICollection<RecipeBook> Books { get; set; } 

    } 
} 

モデル:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Threading.Tasks; 

namespace Receptenboek.Models 
{ 
    public class Recipe 
    { 
     public int ID { get; set; } 
     [Required] 
     [Display(Name = "Book")] 
     public int RecipeBookID { get; set; } 
     [Required] 
     [Display(Name = "Recipe Name")] 
     public string Name { get; set; } 

     public ICollection<Recipe_Ingredient> Ingredients { get; set; } 
     public RecipeBook Book { get; set; } 
    } 
} 

答えて

0

あなたは、foreachループを使用しているので、あなたのコードは、意志重複するIでHTMLをレンダリングするDs。これによりPOST時にモデル・バインディングが失敗します。 forループで置き換えてから、どちらか一方に置き換える必要があります。

  1. は、この溶液中のように、異なるアイテムを区別するためにインデックスを使用する:ASP.NET Core 1.0 POST IEnumerable<T> to controller
  2. 使用Html.EditorForように、このドキュメントのように:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms#the-input-tag-helper
関連する問題