ASP.NET MVC 5站点 - 编辑视图不在DropDownListFor

时间:2016-09-18 19:32:32

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

我有一个MVC 5网站......

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

我有几个要求。

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

控制器(获取)

public ActionResult Edit(Guid Id)
{
    // Get Story
    var story = StoryRepo.SelectArticle(Id);

    // Put select list of all places in ViewBag
    ViewBag.PlaceId = new SelectList(PlaceRepo.SelectAll(), "Id", "PlaceName", new { Id = story.PlaceId });

    // Return view
    return View(story);
}

在视图中

@Html.DropDownListFor(x => x.PlaceId, (IEnumerable<SelectListItem>)ViewBag.PlaceId, "No Associated Place",
                                    new { @class = "form-control" })

这会精确填充下拉列表,当您选择项目时,PlaceId位于绑定到控制器的模型中。但是 - 它在视图加载时不会选择现有的PlaceId。

不应该是ViewBag.PlaceId行new { Id = story.PlaceId }中的最后一个参数 - 导致此选择吗?

我无法在线找到关于此特定问题的任何内容 - 并且几乎找不到如何以我需要的方式将下拉列表绑定到强类型编辑视图。

如何选择正确的项目? (我对此的改进也有所改进。)

感谢。

1 个答案:

答案 0 :(得分:1)

我认为您需要更改以下代码

   // Put select list of all places in ViewBag
    ViewBag.PlaceId = new SelectList(PlaceRepo.SelectAll(), "Id",
                             "PlaceName", new { Id = story.PlaceId });

成为

   // Put select list of all places in ViewBag
    ViewBag.PlaceId = new SelectList(PlaceRepo.SelectAll(), "Id", 
                             "PlaceName", story.PlaceId);

msdn

中SelectedList的定义
  

SelectList(IEnumerable,String,String,Object):初始化一个新的   通过使用指定项的SelectList类的实例   列表,数据值字段,数据文本字段和选定的值。

这是一个有效的demo

更新demo

希望这会对你有所帮助