使用默认值从SelectList创建DropDownListFor

时间:2013-06-20 13:57:05

标签: c# asp.net-mvc-4

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

6 个答案:

答案 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 })