2012-08-13 74 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一個選項中進行選擇。