2011-07-24 58 views
47

这里是我的模型:下拉列表集MVC3剃刀选择的价值

public class NewsCategoriesModel { 
    public int NewsCategoriesID { get; set; }   
    public string NewsCategoriesName { get; set; } 
} 

我的控制器:

public ActionResult NewsEdit(int ID, dms_New dsn) { 
    dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault(); 
    var categories = (from b in dc.dms_NewsCategories select b).ToList(); 
    var selectedValue = dsn.NewsCategoriesID; 
    SelectList ListCategories = new SelectList(categories, "NewsCategoriesID", "NewsCategoriesName",selectedValue); 

    // ViewBag.NewsCategoriesID = new SelectList(categories as IEnumerable<dms_NewsCategory>, "NewsCategoriesID", "NewsCategoriesName", dsn.NewsCategoriesID); 
    ViewBag.NewsCategoriesID = ListCategories; 
    return View(dsn); 
} 

然后我的观点:

@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID) 

当我运行时,DropDownList不会选择我设定的值..它总是选择第一个选项。

+9

你的模型,并选择列表中有相同的名字,你不能这样做。看我的DDL教程http://www.asp.net/mvc/tutorials/javascript/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc和http: //blogs.msdn.com/b/rickandy/archive/2012/01/09/cascasding-dropdownlist-in-asp-net-mvc.aspx – RickAndMSFT

+0

@ RickAnd-MSFT:我相信您的评论应该被视为接受的答案。谢谢 –

回答

92

您应该使用视图模型,而忘记了ViewBag认为它好像它不存在。你会看到事情变得更容易。所以定义视图模式:

public class MyViewModel 
{ 
    public int SelectedCategoryId { get; set; } 
    public IEnumerable<SelectListItem> Categories { get; set; } 
} 

,然后填充这个视图控制器模型:

public ActionResult NewsEdit(int ID, dms_New dsn) 
{ 
    var dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault(); 
    var categories = (from b in dc.dms_NewsCategories select b).ToList(); 

    var model = new MyViewModel 
    { 
     SelectedCategoryId = dsn.NewsCategoriesID, 
     Categories = categories.Select(x => new SelectListItem 
     { 
      Value = x.NewsCategoriesID.ToString(), 
      Text = x.NewsCategoriesName 
     }) 
    }; 
    return View(model); 
} 

终于在您的视图中使用强类型DropDownListFor帮手:

@model MyViewModel 

@Html.DropDownListFor(
    x => x.SelectedCategoryId, 
    Model.Categories 
) 
+0

是的,它现在正在工作,谢谢:) –

+43

使用ViewBag包含SelectList没有错 - MVC脚手架机制这样做。他的问题是在模型和选择列表中使用相同的名称。 – RickAndMSFT

+2

这个答案完全错过了这个问题。 @RickAndMSFT,感谢实际解决方案 – Liam

18

刚如果有人遇到这个问题,我就是这样做的,请忘记存储库对象,我正在使用存储库模式,您可以使用您的对象上下文来检索en tities。而且也不关注我的实体名称,我的实体类型Action与MVC Action没有任何关系。

控制器:

ViewBag.ActionStatusId = new SelectList(repository.GetAll<ActionStatus>(), "ActionStatusId", "Name", myAction.ActionStatusId); 

注重的是选择列表的构造函数的最后一个变量是选定值(对象了selectedValue)

那么这是我的看法,以使其:

<div class="editor-label"> 
    @Html.LabelFor(model => model.ActionStatusId, "ActionStatus") 
</div> 
<div class="editor-field"> 
    @Html.DropDownList("ActionStatusId") 
    @Html.ValidationMessageFor(model => model.ActionStatusId) 
</div> 

我认为这很简单,我希望这有助于! :)

+1

你先生是个天才! – Ben

+0

谢谢本。老实说,我认为我的解决方案是最简单的解决方案之一。只需创建SelectList并同时在SelectList的构造函数中传递选定的值。很高兴帮助你:) –

+0

当我发现自己处于一种我的viewmodel类型列表并需要在循环的同一页面上多次执行此问题的情况时,这对我来说很好。我认为比必须重新使用我的视图模型更清洁。 – sovemp

8

那么它的控制器很简单,你有财产以后这样的:

- 控制器

ViewBag.Profile_Id = new SelectList(db.Profiles, "Id", "Name", model.Profile_Id); 

- 查看(选项A)

@Html.DropDownList("Profile_Id") 

- 查看(选项B) - >将空值发送到列表

@Html.DropDownList("Profile_Id", null, "-- Choose --", new { @class = "input-large" }) 
+0

可以请你解释使用'null'而不是'ViewBag.Profile_Id作为SelectList'之间的区别是什么 – nishanthan

5

我想在这里提供正确的答案,以防其他人遇到像我一样的问题。如果你讨厌ViewBag,那么不要使用它,但是问题中代码的真正问题是,同样的名字被用于模型属性和选择列表,正如@RickAndMSFT指出的那样

简单地改变DropDownList控件的名称应该解决这个问题,比如:

@Html.DropDownList("NewsCategoriesSelection", (SelectList)ViewBag.NewsCategoriesID) 

它并不真正有什么用的ViewBag或不使用ViewBag,你可以有一个名称冲突与不管。

1

要选择IT部门,当从tblDepartment表中加载部门时,请使用以下重载的SelectList类的构造函数。请注意,我们为selectedValue参数传递了1的值。

ViewBag.Departments = new SelectList(db.Departments, "Id", "Name", "1"); 
2

代码波纹管,get from,去

控制器:

int DefaultId = 1; 
ViewBag.Person = db.XXXX 
     .ToList() 
     .Select(x => new SelectListItem { 
      Value = x.Id.ToString(), 
      Text = x.Name, 
      Selected = (x.Id == DefaultId) 
     }); 

查看:

@Html.DropDownList("Person") 

注: ViewBag。 和@ Html.DropDownList(“”)的名称应该是在视图模型

+0

这个解决方案为我工作,因为我没有选择使用DropdownListFor作为我在运行时动态下拉式下拉菜单。谢谢。 – anu

6

替换下面符合新更新的工作代码:

@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID) 

现在实现新的更新工作代码

@Html.DropDownListFor(model => model.NewsCategoriesID, ViewBag.NewsCategoriesID as List<SelectListItem>, new {name = "NewsCategoriesID", id = "NewsCategoriesID" }) 
4

我钻了下拉列表的形成而不是使用@Html.DropDownList()。如果你必须设置的下拉列表中在运行时剃刀的价值,而不是控制的,这非常有用:

<select id="NewsCategoriesID" name="NewsCategoriesID"> 
    @foreach (SelectListItem option in ViewBag.NewsCategoriesID) 
    { 
     <option value="@option.Value" @(option.Value == ViewBag.ValueToSet ? "selected='selected'" : "")>@option.Text</option> 

    } 
</select> 
相关问题