0

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

3 回答 3

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)
于 2012-08-13T15:25:11.347 回答
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; }
}

然后在你的 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

于 2012-08-13T15:31:00.550 回答
0

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

于 2012-08-13T15:40:52.960 回答