@ Html.DropDownList在提交时返回null

时间:2014-06-30 05:52:36

标签: c# asp.net asp.net-mvc asp.net-mvc-4 html-helper

我有一个场景。我想在表单中进行HTTP POST操作,所以我就是这样做的。

public class Item
{
  public Item()
  {
    Storages = new HashSet<Storage>();
  }
  public int Id { get; set; }
  public string Name { get; set; }

  public virtual ICollection<Storage> Storages { get; set; }
  -- remove some lines for brevity --
}

public class Storage
{
  public int Id { get; set; }
  public string Name { get; set; }
  --- remove some lines for brevity --
}

所以基本上,Item有很多Storage所以我创建了viewmodel。

public class CreateStockViewModel
{
  public string Name { get; set; }
  public int StorageId { get; set; }
  -- remove some lines for brevity --
}

在我的Controller中。我有这个

[HttpGet]
public ActionResult Create()
{
  ViewBag.Storages = _storageService.All
                       .OrderBy(i => i.Name)
                       .ToSelectList(s => s.Name, s => s.Id);

  return View();
}

在我的观点中:

@model Wsfis.Web.ViewModels.ItemViewModels.CreateStockViewModel

@Html.DropDownList("Storages")

现在我的问题是,当我提交表格时。并且传递模型Quick Watch。它是Null0

public ActionResult Create(CreateStockViewModel item)
{
  // some code
}

简而言之,

  1. 当我提交表单时,除了@Html.DropDownList之外,所有字段都被绑定。我在哪里错过了?
  2. 另外一些注意事项:

    1. 他们说Views应该是强类型的。那么我应该在View传递什么呢? (示例代码很棒。谢谢)
    2. 对于ToSelectList方法,我复制了这个code(我希望没关系)

      非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

您的表单输入与您的属性具有不同的名称,因此默认的模型绑定器不知道如何绑定您的模型。

您可以使用不同的名称来使用DropDownList帮助程序,但我更喜欢使用强类型帮助程序:

@Html.DropDownListFor(m => m.StorageId, ViewBag.Storages as IEnumerable<SelectListItem>)

答案 1 :(得分:0)

试试这样:

 ViewBag.StorageId = _storageService.All
                       .OrderBy(i => i.Name)
                       .ToSelectList(s => s.Name, s => s.Id);

在视图中:

@Html.DropDownList("StorageId")

现在它将在CreateStockViewModel对象的StorageId属性中发布下拉列表选定值。