Drop down menu 如何使用视图模型将selectlist的选定值发布到控制器?

Drop down menu 如何使用视图模型将selectlist的选定值发布到控制器?,drop-down-menu,asp.net-mvc-3,controller,viewmodel,Drop Down Menu,Asp.net Mvc 3,Controller,Viewmodel,这个问题以各种形式提出,但没有一个答案似乎适合我的情况。我只是试图检索控制器中下拉列表的选定值 这是我的密码: ViewModel.cs public class ViewModel { public ViewModel() {} public ViewModel(Contact contact, IEnumerable<State> states) { this.Contact = contact; this.States = new Sel

这个问题以各种形式提出,但没有一个答案似乎适合我的情况。我只是试图检索控制器中下拉列表的选定值

这是我的密码:

ViewModel.cs

public class ViewModel
{
  public ViewModel() {}
  public ViewModel(Contact contact, IEnumerable<State> states)
    {
      this.Contact = contact;
      this.States = new SelectList(states, "Id", "Name", contact.StateId);
    }
  public Contact Contact {get;set;}
  public SelectList States {get;set;}
}
public class ViewModel
{
  public ViewModel() {}
  public ViewModel(Contact contact, IList<State> states)
  {
//no need to pass in a SelectList or IEnumerable, just what your service or repository spits out
    this.Contact = contact;
    this.States = states;
  }
  public Contact Contact {get;set;}
  public IList<State> States {get;set;}
}
View.cshtml

<button type="submit" onclick="javascript:document.update.submit()"><span>Update</span></button>//aesthic usage. 
@{using (Html.BeginForm("Edit", "Controller", FormMethod.Post, new { name = "update" }))
  {
   @Html.HiddenFor(m => m.Contact.Id)
   @Html.LabelFor(m => m.Contact.Name, "Name:")
   @Html.TextBoxFor(m => m.Contact.Name)

   <label for="state">State:</label>
   @Html.DropDownList("state", Model.States)
}
}
Update//aesthic用法。
@{使用(Html.BeginForm(“编辑”、“控制器”、FormMethod.Post、新的{name=“更新”}))
{
@Html.HiddenFor(m=>m.Contact.Id)
@LabelFor(m=>m.Contact.Name,“Name:”)
@Html.TextBoxFor(m=>m.Contact.Name)
声明:
@DropDownList(“state”,Model.States)
}
}
除了在我发布的viewModel中没有将dropdownlist中的任何值传递给控制器之外,所有操作都按预期进行。“编辑”页面和所有字段均正确加载。下拉列表将正确绑定并正确显示其选定值。然而,当我发布时,我只得到一个传递给控制器的“Contact”对象。“状态”SelectList对象为空

我尝试在viewModel Constructor中映射一个“StateId”属性,但也不起作用。我做错了什么


谢谢

尝试改用
@Html.DropDownListFor
,如果“状态”是模型的一部分,您可以这样使用它:

@Html.DropDownListFor(m=>m.Contact.StateId,Model.States,“--请选择一个状态--”
,其中
m.State
保存所选值

为了避免将IEnumerable与模型混淆,我将把它放在ViewBag/ViewData中

它看起来像这样:

@Html.DropDownListFor(m=>m.Contact.StateId,(IEnumerable)ViewBag.States,“--请选择一个州--”


在返回此视图的操作中,您需要将可枚举状态初始化为ViewBag.States属性。

尝试使用
@Html.DropDownListFor
,如果“状态”是模型的一部分,您可以这样使用它:

@Html.DropDownListFor(m=>m.Contact.StateId,Model.States,“--请选择一个状态--”
,其中
m.State
保存所选值

为了避免将IEnumerable与模型混淆,我将把它放在ViewBag/ViewData中

它看起来像这样:

@Html.DropDownListFor(m=>m.Contact.StateId,(IEnumerable)ViewBag.States,“--请选择一个州--”


在返回此视图的操作中,您需要将可枚举状态初始化为ViewBag.States属性。

我讨厌回答自己的问题,但基于我遇到的多个问题以及大量可用答案,我想我会总结我的发现

首先感谢菲利普,他的回答并没有完全解决我的问题,但它把我引向了正确的方向+一,

如果您正在创建一个需要下拉列表才能查看和编辑的表单,下面是一些建议和要点。首先,我将列出满足我需要的参数列表

  • 在我看来,强类型视图更可取。最小化魔术字符串
  • 视图模型应该包含尽可能少的逻辑和无关元素。唯一的工作应该是促进数据对象的收集
  • 下拉列表应显示所选值
  • 所选值应在表单提交时轻松映射回视图模型
  • 这听起来似乎是一个显而易见且容易获得的列表,但对于MVC新手来说,情况并非如此。我将修改我的代码从上面的评论。这就是我所做的

    ViewModel.cs

    public class ViewModel
    {
      public ViewModel() {}
      public ViewModel(Contact contact, IEnumerable<State> states)
        {
          this.Contact = contact;
          this.States = new SelectList(states, "Id", "Name", contact.StateId);
        }
      public Contact Contact {get;set;}
      public SelectList States {get;set;}
    }
    
    public class ViewModel
    {
      public ViewModel() {}
      public ViewModel(Contact contact, IList<State> states)
      {
    //no need to pass in a SelectList or IEnumerable, just what your service or repository spits out
        this.Contact = contact;
        this.States = states;
      }
      public Contact Contact {get;set;}
      public IList<State> States {get;set;}
    }
    
    查看//在此感谢Artirto

    @{使用(Html.BeginForm(“编辑”、“控制器”、FormMethod.Post))
    {
    @Html.HiddenFor(m=>m.Contact.Id)
    @DropDownListFor(m=>m.Contact.StateId,新选择列表(Model.States,“Id”,“Name”,“@Model.Contact.StateId))
    }
    }
    
    我讨厌回答我自己的问题,但基于我提出的多个问题以及无数的答案,我想我会总结一下我的发现

    首先感谢菲利普,他的回答并没有完全解决我的问题,但它把我引向了正确的方向+一,

    如果您正在创建一个需要下拉列表才能查看和编辑的表单,下面是一些建议和要点。首先,我将列出满足我需要的参数列表

  • 在我看来,强类型视图更可取。最小化魔术字符串
  • 视图模型应该包含尽可能少的逻辑和无关元素。唯一的工作应该是促进数据对象的收集
  • 下拉列表应显示所选值
  • 所选值应在表单提交时轻松映射回视图模型
  • 这听起来似乎是一个显而易见且容易获得的列表,但对于MVC新手来说,情况并非如此。我将修改我的代码从上面的评论。这就是我所做的

    ViewModel.cs

    public class ViewModel
    {
      public ViewModel() {}
      public ViewModel(Contact contact, IEnumerable<State> states)
        {
          this.Contact = contact;
          this.States = new SelectList(states, "Id", "Name", contact.StateId);
        }
      public Contact Contact {get;set;}
      public SelectList States {get;set;}
    }
    
    public class ViewModel
    {
      public ViewModel() {}
      public ViewModel(Contact contact, IList<State> states)
      {
    //no need to pass in a SelectList or IEnumerable, just what your service or repository spits out
        this.Contact = contact;
        this.States = states;
      }
      public Contact Contact {get;set;}
      public IList<State> States {get;set;}
    }
    
    查看//在此感谢Artirto

    @{使用(Html.BeginForm(“编辑”、“控制器”、FormMethod.Post))
    {
    @Html.HiddenFor(m=>m.Contact.Id)
    @DropDownListFor(m=>m.Contact.StateId,新选择列表(Model.States,“Id”,“Name”,“@Model.Contact.StateId))
    }
    }
    
    我使用了ViewBag,它的工作原理与预期一样,但它看起来就像是另一款迷你viewmodel。为了基于我发布的代码进行论证,为什么选择列表作为视图模型的一部分时会返回空值?因为在您的模型中,您需要一个
    SelectList
    ,而表单不会发布该列表。如果在名为“state”的操作上添加一个
    字符串
    参数,它应该会得到您选择的值。我使用了ViewBag,它按预期工作,但它有点像另一个迷你viewmodel。为了基于我发布的代码进行论证,为什么选择列表作为视图模型的一部分时返回空值?因为在您的模型中,您需要一个
    SelectL