この質問が何度か出されたのを見たことがあります。MS ミュージック ストアのデモを自分で試してみましたが、うまくいきませんでしたが、それでもうまくいきませんでした。また、ビューモデルで MultiSelectList オブジェクトを見ると、選択された項目プロパティに正しい項目が含まれていることに気付きましたが、結果ビューを展開すると、選択された値を持つリストボックス項目がありません。ここで何が欠けていますか?私は狂った薬を飲んでいるような気がします!前もって感謝します。
モデル:
public class Article
{
public int ArticleID { get; set; }
public DateTime? DatePurchased { get; set; }
public DateTime? LastWorn { get; set; }
public string ThumbnailImg { get; set; }
public string LargeImg { get; set; }
public virtual List<Outfit> Outfits { get; set; }
public virtual List<Tag> Tags { get; set; }
}
ビューモデル:
public class ArticleViewModel
{
public int ArticleID { get; set; }
public List<Tag> Tags { get; set; }
public MultiSelectList mslTags { get; set; }
public virtual Article Article { get; set; }
public ArticleViewModel(int ArticleID)
{
using (ctContext db = new ctContext())
{
this.Article = db.Articles.Find(ArticleID);
this.Tags = db.Tags.ToList();
this.mslTags = new MultiSelectList(this.Tags, "TagID", "Name", this.Article.Tags);
}
}
}
コントローラ:
public ActionResult Index()
{
ArticleIndexViewModel vm = new ArticleIndexViewModel(db);
return View(vm);
}
見る:
@model ClosetTracker.ArticleViewModel
@using (Html.BeginForm())
{
<img id="bigImg" src="@Model.Article.ThumbnailImg" alt="img" />
@Html.HiddenFor(m => m.ArticleID);
@Html.LabelFor(m => m.Article.Tags)
@* @Html.ListBoxFor(m => m.Article.Tags, Model.Tags.Select(t => new SelectListItem { Text = t.Name, Value = t.TagID.ToString() }), new { Multiple = "multiple" })
*@
@Html.ListBoxFor(m => m.Article.Tags, Model.mslTags);
@Html.LabelFor(m => m.Article.LastWorn)
@Html.TextBoxFor(m => m.Article.LastWorn, new { @class = "datepicker" })
@Html.LabelFor(m => m.Article.DatePurchased)
@Html.TextBoxFor(m => m.Article.DatePurchased, new { @class = "datepicker" })
<p>
<input type="submit" value="Save" />
</p>
}
編集済み
OK、MultiSelectList のコンストラクターを変更して、Tag オブジェクトのリストではなく、選択された値の引数に TagID のリストを含めました。これにより、デバッグ モードで mslTags オブジェクトを監視すると、結果ビューで選択された正しいタグが表示されます。ただし、まだページに正しくレンダリングされていません。
public class ArticleViewModel
{
public int ArticleID { get; set; }
public List<Tag> Tags { get; set; }
public MultiSelectList mslTags { get; set; }
public virtual Article Article { get; set; }
public ArticleViewModel(int ArticleID)
{
using (ctContext db = new ctContext())
{
this.Article = db.Articles.Find(ArticleID);
this.Tags = db.Tags.ToList();
this.mslTags = new MultiSelectList(this.Tags, "TagID", "Name", this.Article.Tags.Select(t => t.TagID).ToList());
}
}
}
更新 2
listboxfor の代わりに listbox ヘルパーを使用しようとしましたが、正常に動作します
@Html.ListBox("ArticleTags", new MultiSelectList(Model.Tags, "TagID", "Name", Model.selectedTagIDs))