这是我的模型:
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
不会选择我设置的值。它总是选择第一个选项。
您应该使用视图模型并忘记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
)
对于任何不想或不想使用dropdownlistfor的人来说,这是我在jQuery中使用.NET MVC设置的方法。
var settings = @Html.Raw(Json.Encode(Model.GlobalSetting.NotificationFrequencySettings));
SelectNotificationSettings(settings);
function SelectNotificationSettings(settings) {
$.each(settings, function (i, value) {
$("#" + value.NotificationItemTypeId + " option[value=" + value.NotificationFrequencyTypeId + "]").prop("selected", true);
});
}
@Html.DropDownList(NotificationItemTypeEnum.GenerateSubscriptionNotification.ToString,
notificationFrequencyOptions, optionLabel:=DbRes.T("Default", "CommonLabels"),
htmlAttributes:=New With {.class = "form-control notification-item-type", .id = Convert.ToInt32(NotificationItemTypeEnum.GenerateSubscriptionNotification)})
当页面加载时,你的js函数将根据存储在@model中的值设置所选的选项。
干杯。
为了防止有人提出这个问题,我就是这样做的,请忘记存储库对象,我正在使用存储库模式,你可以使用你的对象上下文来检索实体。而且也不注意我的实体名称,我的实体类型Action与MVC Action无关。
控制器:
ViewBag.ActionStatusId = new SelectList(repository.GetAll<ActionStatus>(), "ActionStatusId", "Name", myAction.ActionStatusId);
注意SelectList构造函数的最后一个变量是选中的值(object 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>
我认为这很简单,我希望这有帮助! :)
我深入研究了下拉列表的形成,而不是使用@Html.DropDownList()
。如果您必须在运行时在razor而不是controller中设置下拉列表的值,这将非常有用:
<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>
那么在控制器中它非常简单你有这样的东西:
- 控制器
ViewBag.Profile_Id = new SelectList(db.Profiles, "Id", "Name", model.Profile_Id);
- 查看(选项A)
@Html.DropDownList("Profile_Id")
--View(选项B) - >将空值发送到列表
@Html.DropDownList("Profile_Id", null, "-- Choose --", new { @class = "input-large" })
用新更新的工作代码替换下面的行:
@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID)
现在实现新的更新工作代码:
@Html.DropDownListFor(model => model.NewsCategoriesID, ViewBag.NewsCategoriesID as List<SelectListItem>, new {name = "NewsCategoriesID", id = "NewsCategoriesID" })
我想在这里提出正确答案,以防其他人像我一样遇到这个问题。如果你讨厌ViewBag,可以不使用它,但问题代码的真正问题是同样的名称被用于模型属性和选择列表,正如@RickAndMSFT所指出的那样。
只需更改DropDownList控件的名称就可以解决问题,如下所示:
@Html.DropDownList("NewsCategoriesSelection", (SelectList)ViewBag.NewsCategoriesID)
它与使用ViewBag或不使用ViewBag实际上没有任何关系,因为无论如何都可以与控件发生名称冲突。
我更喜欢DropDownList帮助器的lambda形式 - 请参阅MVC 3 Layout Page, Razor Template, and DropdownList
如果你想使用SelectList,那么我认为这个bug报告可能会有所帮助 - http://aspnet.codeplex.com/workitem/4932
代码吼叫,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.Person和@ Html.DropDownList(“Person”)名称应该与视图模型一样
要选择IT部门,当从tblDepartment表加载部门时,请使用以下SelectList类的重载构造函数。请注意,我们为selectedValue参数传递值1。
ViewBag.Departments = new SelectList(db.Departments, "Id", "Name", "1");