用默认值从SelectList中创建DropDownListFor
本文关键字:创建 DropDownListFor SelectList 默认值 | 更新日期: 2023-09-27 18:19:08
我有一个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>
如何更新此代码以设置默认选择选项?如
<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,但不改变默认选项为New。
我也试过:
@Html.DropDownListFor(model => model.SelectedStatusIndex, new SelectList(@Model.AllStatus, "id", "Description"), new { id = "statusDropdown" })
@Html.ValidationMessageFor(model => model.Item.Item.Status)
选择默认选项"New",但model.Item.Item.Status
不是由HTTP POST上的下拉菜单设置的。
其他细节:
model.Item.Item.Status
为整型。@Model.AllStatus
是一个SQL表,列出了所有可用的状态选项。
已经有一些关于here或 There 的讨论。其中一个问题可能是对键值使用不同于string
的类型。我过去有过类似的问题,我知道我是这样解决的-在准备列表时显式设置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;
这是对上述答案的补充。这就是我要做的。
视图模型是用来表示数据的。因此,对于单个下拉列表,我将使用以下内容:
public class MyViewModel
{
public int StatusId { get; set; }
public IEnumerable<Status> Statuses { get; set; }
}
状态类看起来像这样:
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)
我最后使用了thomasjaworski的一个变体答案。
视图:
@Html.DropDownListFor(model => model.SelectedStatusIndex, new SelectList(@Model.StatusSelectList, "Value", "Text"), new { id = "statusDropdown" })
<<p> 视图模型构造函数/strong> StatusSelectList = AllStatus.Select(x =>
new StatusSelectListItem
{
Text = x.Description,
Value = x.id.ToString()
}).ToList();
this.SelectedStatusIndex = 2;//Default Status is New
Controller on 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
是由下拉菜单设置的。我发现这个控制器的实现很棘手。
您可以使用"Insert"来添加下拉列表的默认值,并将其添加到动态列表中:这样你就不需要在View中使用Razor了。
List<Y> m = X.GetList();
m.Insert(0, new Y{ Name = "--Select--" });
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);
我给DropDownListFor的表达式赋值,这个值已经在List中定义了。这对我很有效。我使用List<SelectListItem> Model.IncidentPriorityList
为ddwn的选择列表。