【问题标题】:MVC3 DropDownListFor not populating selectedValueMVC3 DropDownListFor 不填充 selectedValue
【发布时间】:2012-08-13 15:22:22
【问题描述】:

我觉得我正在服用疯狂的药丸。我有一个视图的下拉列表,它从我们的数据库中读取我们拥有的所有葡萄酒生产商。我想将 selectedValue 设置为由引用页面驱动的特定 ID。我可以看到它在调试中获取了 selectedValue,我看到填充了选定的值(本例中为 906),但是在呈现页面时它没有将下拉列表设置为正确的值,它始终默认为默认值 1价值。我尝试在 razor 中创建 selectList 而不是我的控制器,但没有任何效果。对此的任何帮助将不胜感激,我猜它很小。

控制器:

        if (User.IsInRole("admin"))
        {
            if (ID != 0)
            {
                ViewBag.ProducerSelect = new SelectList(db.Producers.OrderBy(p => p.Name), "ProducerID", "Name", ID);
            }
            else
            {
                ViewBag.ProducerSelect = new SelectList(db.Producers.OrderBy(p => p.Name), "ProducerID", "Name");
            }
        }

查看:

if (User.IsInRole("producereditor"))
{
    <h3>@ViewBag.ProducerName</h3>
}
    else
{
<div class="editor-label">
    @Html.LabelFor(m => m.Wine.ProducerID, "Producer")
</div>
<div class="editor-field">
    @Html.DropDownListFor(m => m.Wine.ProducerID, ViewBag.ProducerSelect as SelectList)
</div>
}

尝试了以下方法但没有成功:

         ViewBag.ProducerSelect = new SelectList(from p in db.Producers
                                                    orderby p.Name
                                                    select new { p.ProducerID, p.Name }
                                                    , "ProducerID", "Name", ID);

【问题讨论】:

    标签: asp.net-mvc-3 razor


    【解决方案1】:

    如果您想预先选择一个项目,您可以将该值设置为您的 ProducerId 属性。

    var yourViewModelObj=new YourViewModel;
    yourViewModelObj.Wine.ProducerId=906; //or whatever value you want
    return View(yourViewModelObj);
    

    建议:为了更好的代码可读性/维护性,尽量避免使用 ViewBag / ViewData 并使用 ViewModel 来传递数据。

    我会在我的 ViewModel 中添加一个属性来保存生产者的集合

    public class WineViewModel
    {
       //Other Existing properties also
       public IEnumerable<SelectListItem> Producers{ get; set; }
       public string SelectedProducer { get; set; }
    }
    

    然后在你的GetAction方法中,你可以像这样设置值,如果你想设置一个选择选项作为默认选择的选项。

    public ActionResult CreateWine()
    {
      var vm=new WineViewModel();
      //The below code is hardcoded for demo. you mat replace with DB data.
      vm.Producers= new[]
      {
        new SelectListItem { Value = "1", Text = "Prodcer A" },
        new SelectListItem { Value = "2", Text = "Prodcer B" },
        new SelectListItem { Value = "3", Text = "Prodcer C" }
      };      
      //Now let's set the default one's value
      vm.SelectedProducer = "2";  
    
      return View(vm);    
    }
    

    在您的强类型视图中,

    @Html.DropDownListFor(x => x.SelectedProducer, 
         new SelectList(Model.Producers, "Value", "Text"), "Select Producer")
    

    上面代码生成的 HTML Markup 将有 HTML 选择,其值为 2 的选项为 selected 1。

    【讨论】:

      【解决方案2】:

      我想通了。我在页面其他地方的隐藏字段中有 ViewModel.wine.ProducerID,默认为 1,所以我只是将其分配给传入的值,效果很好。我知道是这样的。谢谢!

      【讨论】:

      • 啊!隐藏字段总是令人讨厌!很高兴知道这一切最终都解决了。不要忘记投票您认为有帮助的答案
      【解决方案3】:

      使用一个 ViewModel ex WineViewModel

      public class WineViewModel
          {
      
              public Wine Wine { get; set; }
      
              public SelectList PProducerList { get; set; }
      
              public WineViewModel() { }
      
              public WineViewModel(Wine wine) 
              {
                  this.Wine = wine;          
      
              }
          }
      

      在您的控制器中尝试以下操作 var model = new WineViewModel(selectwine);

          model.ProjectTypeList = new SelectList( from p in db.Producers
                                                  orderby p.Name
                                                 select new { p.ID, p.Name }, "ID", "Name")
      

      注意我是如何专门声明哪个是 ID,哪个是我的 SelectList 中的值

      那么在你看来做

           @Html.DropDownListFor(model => model.Wine.ProducerID, Model.ProjectTypeList)
      

      【讨论】:

      • 我会试试看,但是 viewbag 应该可以工作吗?我只是用 ViewModel 的属性替换 viewbag,对吧?
      • 您也可以使用 Viewbag。但始终建议使用 ViewModel 来传递数据。你可以做 ViewBag.ProjectTypeList = new SelectList( from p in db.Producers orderby p.Name select new { p.ID, p.Name }, "ID", "Name) 注意我是如何专门声明哪个是 ID 和这是价值
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多