9

我有一个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)

这会选择默认选项“新建”,但model.Item.Item.Status不是由 HTTP POST 的下拉菜单设置。

其他细节:

model.Item.Item.Status是一个整数。 @Model.AllStatus是一个列出所有可用状态选项的 SQL 表。

4

6 回答 6

15

已经存在一些关于这里那里的讨论。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;
于 2013-06-20T14:20:07.227 回答
6

这是对上述答案的补充。这就是我会做的。

视图模型用于表示您的数据。因此,对于单个下拉列表,我将拥有以下内容:

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)

你去吧。

于 2013-06-21T07:27:17.723 回答
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,是下拉菜单设置的内容。我发现这个控制器实现很棘手。

于 2013-06-20T18:41:12.547 回答
1

您可以使用“插入”添加下拉菜单的默认值并将其添加到您的动态列表中:通过这种方式,您不需要在视图中使用 Razor。

List<Y> m = X.GetList();
m.Insert(0, new Y{ Name = "--Select--" });
于 2017-12-13T11:17:00.967 回答
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);
于 2020-01-09T03:41:15.803 回答
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 })
于 2021-05-05T20:45:29.863 回答