我有dropdownlistfor
:
@Html.DropDownListFor(model => model.Item.Item.Status, new SelectList(@Model.AllStatus, "id", "Description"), new { id = "statusDropdown" })
@Html.ValidationMessageFor(model => model.Item.Item.Status)
HTML输出:
<select id="statusDropdown" class="valid" name="Item.Item.Status" data-val-required="The Status field is required." data-val-number="The field Status must be a number." data-val="true">
<option value="2">Completed by Admin</option>
<option value="3">General Error</option>
<option value="4">New</option>
</select>
如何更新此代码以设置默认选定选项? E.G。
<option value="4" selected>New</option>
我试过了:
@Html.DropDownListFor(model => model.Item.Item.Status, new SelectList(@Model.AllStatus, "id", "Description",@Model.SelectedStatusIndex), new { id = "statusDropdown" })
@Model.SelectedStatusIndex
的值为4,但不会将默认选项更改为“新建”。
我也尝试过:
@Html.DropDownListFor(model => model.SelectedStatusIndex, new SelectList(@Model.AllStatus, "id", "Description"), new { id = "statusDropdown" })
@Html.ValidationMessageFor(model => model.Item.Item.Status)
这会选择默认选项“New”,但HTTP POST上的下拉列表不会设置model.Item.Item.Status
。
其他详情:
model.Item.Item.Status
是一个int。 @Model.AllStatus
是一个SQL表,列出了所有可用的状态选项。
答案 0 :(得分:14)
已经存在一些关于 here 或 there 的讨论。其中一个问题可能是使用与string
不同的类型作为键值。我过去遇到了类似的问题,我知道我解决了它this - 在准备列表时明确设置Selected
属性(在您的情况下,AlLStatus
)。
对于您的情况(在控制器操作中)意味着:
IEnumerable<SelectListItem> selectList =
from s in allStatus // where ever you get this from, database etc.
select new SelectListItem
{
Selected = (s.id == model.Item.Item.Status),
Text = cs.Description,
Value = s.id.ToString()
};
model.AllStatus = selectList;
答案 1 :(得分:4)
这是上述答案的补充。我就是这样做的。
视图模型用于表示您的数据。因此,对于单个下拉列表,我将拥有以下内容:
public class MyViewModel
{
public int StatusId { get; set; }
public IEnumerable<Status> Statuses { get; set; }
}
Status类看起来像这样:
public class Status
{
public int Id { get; set; }
public string Description { get; set; }
}
控制器处理视图的操作方法:
public class MyController
{
private readonly IStatusService statusService;
public MyController(IStatusService statusService)
{
this.statusService = statusService;
}
public ActionResult MyActionMethod()
{
MyViewModel viewModel = new MyViewModel
{
Statuses = statusService.GetAll(),
StatusId = 4 // Set the default value
};
return View(viewModel);
}
}
视图将如下所示:
@model MyProject.ViewModels.MyViewModel
@Html.DropDownListFor(
x => x.StatusId,
new SelectList(Model.Statuses, "Id", "Description", Model.StatusId),
"-- Select --"
)
@Html.ValidationMessageFor(x => x.StatusId)
你去。
答案 2 :(得分:3)
我最终使用了thomasjaworski答案的变体。
查看:强>
@Html.DropDownListFor(model => model.SelectedStatusIndex, new SelectList(@Model.StatusSelectList, "Value", "Text"), new { id = "statusDropdown" })
ViewModel构造函数
StatusSelectList = AllStatus.Select(x =>
new StatusSelectListItem
{
Text = x.Description,
Value = x.id.ToString()
}).ToList();
this.SelectedStatusIndex = 2;//Default Status is New
HTTP POST控制器
我从下拉列表中单独设置model.Item.Item.Status
:
model.Item.Item.Status = model.SelectedStatusIndex;
因为下拉设置是作为第一个参数传递的表达式的值:
@Html.DropDownListFor(model => model.SelectedStatusIndex, new SelectList(@Model.StatusSelectList, "Value", "Text"), new { id = "statusDropdown" })
在这种情况下,model.SelectedStatusIndex
是下拉列表设置的内容。我发现这个控制器实现很棘手。
答案 3 :(得分:0)
您可以使用&#34;插入&#34;用于添加Dropdown的默认值并将其添加到动态列表中: 通过这种方式,您不需要在视图中使用Razor。
List<Y> m = X.GetList();
m.Insert(0, new Y{ Name = "--Select--" });
答案 4 :(得分:0)
SelectList ProductSizeList = new SelectList(_context.Sizes, "SizeId", "SizeName");
//after you create the selectList you have to create the default select list item
SelectListItem AllSize = new SelectListItem("All Size", "0");
// and after this you add this item to the begin of the selectlist
ViewData["SizeId"] = ProductSizeList.Prepend(AllSize);
答案 5 :(得分:0)
我为 DropDownListFor 的表达式分配了已在 List 中定义的值。这个对我有用。我使用 List<SelectListItem> Model.IncidentPriorityList
作为 ddwn 的选择列表。
Model.incident.INCIDENT_PRIORITY_ID = Model.DefaultParameterId; @Html.DropDownListFor(m => m.incident.INCIDENT_PRIORITY_ID, Model.IncidentPriorityList, "Select", new { @class = "form-control selectpicker", id = "drpPriority", @required = true })