我有一个MVC 5站点,我想使用带有ViewModel的强类型DropDownListFor - 而不是ViewBag。
我已经找到了各种各样的文章 - 但它们似乎都有很大的漏洞 - 例如这个不包括编辑,我不明白应该如何或何时使用“SelectedFlavourId”。 http://odetocode.com/blogs/scott/archive/2013/03/11/dropdownlistfor-with-asp-net-mvc.aspx
我有几个要求。
以下是经过一天的挫折后我所得到的。
故事可以选择与PlaceId相关联。空白的placeId也有效。一个地方也可以与一个以上的故事相关联。
模型
public class Place
{
public Guid Id { get; set; }
public string PlaceName { get; set; }
}
public class Story
{
public Guid Id { get; set; }
public Guid? PlaceId { get; set; }
public string StoryName { get; set; }
}
public class StoryPlaceDropdown
{
public Story story { get; set; }
public Guid SelectedStoryId;
public IEnumerable<Place> places;
public IEnumerable<SelectListItem> placeItems
{
get
{
return new SelectList(places, "Id", "PlaceName");
}
}
}
控制器
public ActionResult Edit(Guid Id)
{
var spd = new StoryPlaceDropdown();
spd.places = PlaceRepo.SelectAll();
spd.story = StoryRepo.SelectStory(Id);
spd.selectedStoryID = apd.story.Id;
// Return view
return View(spd);
}
[HttpPost]
public ActionResult Edit(StoryPlaceDropdown spd)
{
// Never gets this far
spd.Places = PlaceRepo.SelectAll();
return View();
}
在视图中
@Html.DropDownListFor(m => m.SelectedStoryId, Model.PlaceItems)
这会填充DropDownList。但是,它不会在编辑视图中选择正确的项目。另外,当我提交表单时,我收到此错误: 你调用的对象是空的。在视图中的这一行@ Html.DropDownListFor(m =&gt; m.SelectedStoryId,Model.PlaceItems)
我怎样才能让这一切都有效?感谢。
答案 0 :(得分:0)
我解决了这个问题 - 我愚蠢地忘了{get;组; ViewModel上的访问器,doh!
答案 1 :(得分:-1)
您可以通过以下三个步骤解决此问题:
第1步:创建viewmodel
public class StoryPlaceDropdown
{
Required]
[Display(Name = "SelectedStory")]
public int SelectedStoryId { get; set; }
}
步骤2:在控制器上执行此操作后,您可以写:
public ActionResult Edit(Guid Id)
{
var spd = new StoryPlaceDropdown();
ViewBag.PlaceItems= PlaceRepo.SelectAll();
spd.story = StoryRepo.SelectStory(Id);
spd.selectedStoryID = apd.story.Id;
return View(spd);
}
第3步:在视图中你可以写
<div class="col-sm-6">
@Html.DropDownListFor(m => m.SelectedStoryId, new SelectList(@ViewBag.PlaceItems, "Id", "PlaceName"), "---Select---", new { @class = "form-control select-sm" })
</div>