asp.net mv 5,DropDownListFor与ViewModel无法正常工作

时间:2016-09-18 22:08:36

标签: asp.net-mvc asp.net-mvc-5

我有一个MVC 5站点,我想使用带有ViewModel的强类型DropDownListFor - 而不是ViewBag。

我已经找到了各种各样的文章 - 但它们似乎都有很大的漏洞 - 例如这个不包括编辑,我不明白应该如何或何时使用“SelectedFlavourId”。 http://odetocode.com/blogs/scott/archive/2013/03/11/dropdownlistfor-with-asp-net-mvc.aspx

我有几个要求。

  • 在编辑故事时,我想要一个所有地方的下拉列表 显示 - 与相关位置(如果有) - 选中。
  • 我想使用强类型DropDownListFOR(而不是 DropDownList的)。
  • 我想使用ViewModel而不是ViewBag。
  • 我想添加一个“No Associated Place” 如果PlaceId为null,则选择此选项。
  • 我想在DropDownListFor。
  • 中添加一个css class =“form-control”

以下是经过一天的挫折后我所得到的。

故事可以选择与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)

我怎样才能让这一切都有效?感谢。

2 个答案:

答案 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>