2012-08-13 73 views
0

我觉得我正在吃疯狂的药。我有一个从我们的数据库读取所有葡萄酒生产者的视图的下拉列表。我想将selectedValue设置为推荐页面驱动的特定ID。我可以看到它在调试中选择了selectedValue,我看到填充的选定值(在本例中为906),但在页面呈现时,它不会将下拉列表设置为正确的值,对于默认值,它始终默认为1值。我已经尝试在剃刀中创建selectList,而不是我的控制器,但没有任何工作。任何帮助,这将不胜感激,我猜这是小事。MVC3 DropDownListFor不填充selectedValue

控制器:

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

回答

0

我想通了。我在页面的其他地方隐藏了一个ViewModel.wine.ProducerID,默认为1,所以我只是分配了这个值,并且它工作得很好。我知道这是这样的。谢谢!

+0

啊!隐藏的领域总是滋扰!!很高兴知道这一切都结束了。不要忘记投票你认为有帮助的答案 – superartsy 2012-08-13 15:46:21

0

用户视图模型前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) 
+0

我会试试,但应该viewbag工作?我只是用ViewModel的属性来替换viewbag,对吧? – user576838 2012-08-13 15:32:10

+0

您可以使用Viewbag,但始终建议使用ViewModel来传递数据。 你可以做 ViewBag.ProjectTypeList =新的SelectList(上接第在db.Producers 排序依据p.Name 选择新{p.ID,p.Name}, “ID”,“名称) 通知我怎么了专门宣布哪个是ID,哪个是价值 – superartsy 2012-08-13 15:41:06

0

如果要预先选择一个项目,你将该值设置为您的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; } 
} 

然后在YOUT的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标记将有HTML与价值2为selected一个选项中进行选择。