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

Passing Model via dropDownListFor() from view to controller

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

这就是我的模型

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" />
    }

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

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

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

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

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

post 上的一个 <select> 元素返回单个值。 Html 不知道你的 c# Model class 是什么,所以你不能绑定到一个复杂的对象。您需要绑定到 ModelModelId 属性。您的视图模型应该是

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);
}

并在视图中

@Html.LabelFor(m => m.SelectedModel)
@Html.DropDownListFor(m => m.SelectedModel, Model.ModelItems)

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