用默认值从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表,列出了所有可用的状态选项。

用默认值从SelectList中创建DropDownListFor

已经有一些关于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的选择列表。

<>以前Model.incident。INCIDENT_PRIORITY_ID = Model.DefaultParameterId;@Html。DropDownListFor(m => m.incident.)INCIDENT_PRIORITY_ID,模型。{@class = "form-control selectpicker", id = " drpripriority ", @required = true})