0

レシピとタグがあるアプリがあります。レシピには複数のタグを含めることができ、タグは複数のレシピに属することができるため、次のモデルがあります。

public class Tag : IModel
{
    [Key]
    public int ID { get; set; }
    [Required(ErrorMessage = "Name is required.")]
    public string Name { get; set; }
    public virtual ICollection<Recipe> Recipes { get;set; }
}

public class Recipe : IModel
{
    [Key]
    public int ID { get; set; }
    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    [Required(ErrorMessage = "The Title is required.")]
    public string Title { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
    public virtual Category Category { get; set; }
}

私のレシピコントローラーには、ビューのレシピを返すHttpGetEditアクションがあります。

public ActionResult Edit(int id = 0)
    {

        Recipe recipe = _recipeService.GetByID(id, "Category,Tags");
        if (recipe == null)
        {
            return HttpNotFound();
        }
        CreateEditRecipeViewModel viewModel = new CreateEditRecipeViewModel(recipe, PopulateCategoryLookup(recipe));
        return View(viewModel);
    }

この時点で、レシピのタグコレクションは私のGetById()メソッドによって入力されます。ただし、ビューにコレクションを追加してビューに表示できるようにする方法がわかりません。これが私の現在のビューモデルです:

public class CreateEditRecipeViewModel
{        
    [HiddenInput]
    public int RecipeID { get; set; }
    public int CategoryId { get; set; }
    [Required(ErrorMessage = "The Title is required.")]
    public string Title { get; set; }
}

私の見解では、タグのコンマ区切りリスト(朝食、ベジタリアン、グルテンフリーなど)を含むテキストボックスが必要です。編集ビューが表示されたら、レシピに現在割り当てられている各タグの名前を入力してください。フォームが投稿されたら、タグリストを分割し、HttpPost Editアクションで、値をEFと調整します。

誰かがViewModelとViewで複雑なオブジェクトのコレクションを表現するためのガイダンスを持っているなら、私はそれをいただければ幸いです!

ありがとう、

クリス

4

1 に答える 1

1

私は通常、ListBoxForタグをChosen jquery プラグインと組み合わせて使用​​して、複数選択を行います。驚くほど簡単です。これがコード的にどのように見えるかを見ていきます。しかし、テストするVSが手元にありません。何かのようなもの:

public class CreateEditRecipeViewModel
{        
    [HiddenInput]
    public int RecipeID { get; set; }
    public int CategoryId { get; set; }
    public List<int> TagIds { get; set; }
    [Required(ErrorMessage = "The Title is required.")]
    public string Title { get; set; }
}

//Then in view...

@Html.ListBoxFor(model => model.TagIds, HelperMethodToGetSelectListOfTags())

次に、ビューモデルを通常のモデルに戻すときに、選択したIDをEFと調整するだけです。

このアプローチの唯一の欠点は、新しいタグを作成するために別のコードが必要になることです。しかし、あなたはそれを要件として言及していませんでした。

それが役立つことを願っています!

于 2013-01-01T20:09:32.980 に答える