MVC3 DropDownList不填充selectedValue

时间:2012-08-13 15:22:22

标签: asp.net-mvc-3 razor

我觉得我正在服用疯狂的药片。我有一个视图的下拉列表,从我们的数据库中读取我们拥有的所有葡萄酒生产商。我想将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);

3 个答案:

答案 0 :(得分:0)

使用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)

答案 1 :(得分:0)

如果要预先选择一个项目,请将该值设置为ProducerId属性。

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

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

我会在我的ViewModel中添加一个Property来保存Productions集合

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标记将使用值为2的选项进行HTML选择,为selected一个。

答案 2 :(得分:0)

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