通过dropDownListFor()将模型从视图传递到控制器

时间:2015-05-21 19:14:07

标签: asp.net-mvc-4 razor html.dropdownlistfor

我正在尝试使用dropDownListFor将模型从我的视图传递给我的控制器。 从列表中选择某些内容后,它会将模型发送到我的控制器,但它的内容为NULL

这就是我对Model

的看法
public class Model
{
    public int ModelId { get; set; }
    [Required]
    public string Name { get; set; }
}

这就是我的ViewModel的样子

public class ModelVM
{
    public List<Model> Models;
    public Model SelectModel { get; set; }
    public IEnumerable<SelectListItem> ModelItems
    {
        get { return new SelectList(Models, "ModelId", "Name"); }
    }
}

将数据放入ViewModel时的控制器如下所示

    public ActionResult Index()
    {
        ModelVM modelVM= new ModelVM()
        {
            Models = manager.GetAllModels().ToList()
        };
        return View(modelVM);
    }

最后这是我在DropDownList的视图中所拥有的

    @using (Html.BeginForm("Home", "Home", FormMethod.Post))
    {
        @Html.DropDownListFor(model => model.SelectModel, Model.ModelItems)
        <input type="submit" value="Go" />
    }

所以这应该将Model发送给我的控制器。 但是当我检查控制器中传递的模型的内容时,一切都是NULL,这不应该是因为当我调试视图并检查ModelItems的内容时,ModelItems中的所有内容都在那里

这是我检查传递的模型的内容

 public ActionResult Home(Model model) <<<<<<<<<< Content == NULL
    {
        return View();
    }

2 个答案:

答案 0 :(得分:3)

帖子上的<select>元素支持单个值。 Html没有关于你的c#Model类的概念,所以你不能绑定到复杂的对象。您需要绑定到ModelId的{​​{1}}属性。您的视图模型应为

Model

并在控制器中

public class ModelVM
{
  [Display(Name = "Model")]
  public int SelectedModel { get; set; }
  public SelectList ModelItems { get; set ;}
}

并在视图中

public ActionResult Index()
{
    ModelVM modelVM = new ModelVM()
    {
        ModelItems = new SelectList(manager.GetAllModels(), "ModelId", "Name")
        // SelectedModel = ? if you want to preselect an item
    };
    return View(modelVM);
}

并且在post方法中,您的模型将与所选模型的ID正确绑定

答案 1 :(得分:0)

尝试将ModelVM类型传递给Home操作,因为这是传递给Index视图的类型。

而不是下拉声明中的model.SelectModel,您只需要一个int ID来捕获选择的ID。