MVC SelectList 将随机值设置为 'selected'
MVC SelectList setting random value as 'selected'
我有一个硬编码的 select 列表,从数据库中提取值和文本。
我有一个要设置为 "default" 的特定项目,因此我命令列表专门将其放在行首 ("Wip")。然而,当列表在HTML中呈现时,列表的顺序是正确的,但是selected的值是具有最小值的项目,即使它位于列表的底部由于降序排列。
型号:
public IEnumerable<SelectListItem> BinOptionsList { get; set; }
数据访问:
public IEnumerable<SelectListItem> PopulateBinList()
{
using (var db = new InventoryContext())
{
var data = db.StorageBin.OrderByDescending(s => s.BinCode == "Wip").ThenBy(s => s.BinCode).Select(s => new SelectListItem()
{
Text = s.BinCode,
Value = s.BinId.ToString()
}).ToList();
return data;
}
}
控制器:
model.BinOptionsList = dal.PopulateBinList()
查看:
@Html.DropDownListFor(model => model.BinId, Model.BinOptionsList, new { @class = "form-control" })
列表在视图中以 "Wip" 作为第一个 selection 呈现,但呈现的 "selected=selected" 选项是 id=0 的项目。
我知道我可以在数据访问方法中设置 'Selected' 值,但是我不能在已经具有 selected 值的编辑表单中使用它。
更新 - 渲染 HTML:
<select class="form-control" data-val="true" data-val-number="The field Bin Code must be a number." data-val-required="The Bin Code field is required." id="BinId" name="BinId">
<option value="582">WIP</option>
<option value="595">0888</option>
<option selected="selected" value="0">0919</option>
<option value="1">1</option>
<option value="2">1A1</option>
<option value="3">1A10</option>
<option value="4">1A11</option>
</select>
所以您可能不喜欢这个答案,但让我简要概述一下。您的 select 列表不应该是您的型号。从您的 select 中 select 得到的值应该是您模型的一部分。您在模型中投入了过多的开销,并且对您的视图产生了影响。重构它。将您的 select 列表放入您的 ViewBag 以供您在视图中使用,停止来回传递它。这将使您的模型保持紧凑并允许您正确设置选项。
这是一个简单的例子。
您的数据访问是什么(为了示例而将其存根,是的,为了简单起见将其设置为静态):
public static IEnumerable<SelectListItem> PopulateBinList()
{
return new List<SelectListItem>{ new SelectListItem {
Text = "WIP", Value = "582"
}, new SelectListItem {
Text = "0888", Value = "595"
} , new SelectListItem {
Text = "0", Value = "0919"
}, new SelectListItem {
Text = "1", Value = "1"
}};
}
然后是你的模型(例如只添加一个 属性)
public class BinModel
{
public string BinId { get; set; }
}
在你的控制器中
public ActionResult Index()
{
//load up your select list into the view bag
ViewBag.BinOptions = ViewHelper.PopulateBinList();
//preset the value of your desired object
var bm = new BinModel { BinId = "582" };
return View(bm);
}
在您的视图中,您将绑定到模型 属性,但使用在视图包中定义的临时列表来填充选项。预设模型的 属性 将自动 select select 列表中的默认值:
@Html.DropDownListFor(x => x.BinId, (IEnumerable<SelectListItem>)ViewBag.BinOptions, null, new { @class ="form-control" })
如果这没有意义或需要扩展,请告诉我。
我很确定 BindId 等于 0。如果 BindId 是一个简单的整数,那么默认情况下它将始终等于 0。您需要自己将其设置为 582 还是将其设置为 Integer?这会将默认值设置为 null。
我有一个硬编码的 select 列表,从数据库中提取值和文本。
我有一个要设置为 "default" 的特定项目,因此我命令列表专门将其放在行首 ("Wip")。然而,当列表在HTML中呈现时,列表的顺序是正确的,但是selected的值是具有最小值的项目,即使它位于列表的底部由于降序排列。
型号:
public IEnumerable<SelectListItem> BinOptionsList { get; set; }
数据访问:
public IEnumerable<SelectListItem> PopulateBinList()
{
using (var db = new InventoryContext())
{
var data = db.StorageBin.OrderByDescending(s => s.BinCode == "Wip").ThenBy(s => s.BinCode).Select(s => new SelectListItem()
{
Text = s.BinCode,
Value = s.BinId.ToString()
}).ToList();
return data;
}
}
控制器:
model.BinOptionsList = dal.PopulateBinList()
查看:
@Html.DropDownListFor(model => model.BinId, Model.BinOptionsList, new { @class = "form-control" })
列表在视图中以 "Wip" 作为第一个 selection 呈现,但呈现的 "selected=selected" 选项是 id=0 的项目。
我知道我可以在数据访问方法中设置 'Selected' 值,但是我不能在已经具有 selected 值的编辑表单中使用它。
更新 - 渲染 HTML:
<select class="form-control" data-val="true" data-val-number="The field Bin Code must be a number." data-val-required="The Bin Code field is required." id="BinId" name="BinId">
<option value="582">WIP</option>
<option value="595">0888</option>
<option selected="selected" value="0">0919</option>
<option value="1">1</option>
<option value="2">1A1</option>
<option value="3">1A10</option>
<option value="4">1A11</option>
</select>
所以您可能不喜欢这个答案,但让我简要概述一下。您的 select 列表不应该是您的型号。从您的 select 中 select 得到的值应该是您模型的一部分。您在模型中投入了过多的开销,并且对您的视图产生了影响。重构它。将您的 select 列表放入您的 ViewBag 以供您在视图中使用,停止来回传递它。这将使您的模型保持紧凑并允许您正确设置选项。
这是一个简单的例子。
您的数据访问是什么(为了示例而将其存根,是的,为了简单起见将其设置为静态):
public static IEnumerable<SelectListItem> PopulateBinList()
{
return new List<SelectListItem>{ new SelectListItem {
Text = "WIP", Value = "582"
}, new SelectListItem {
Text = "0888", Value = "595"
} , new SelectListItem {
Text = "0", Value = "0919"
}, new SelectListItem {
Text = "1", Value = "1"
}};
}
然后是你的模型(例如只添加一个 属性)
public class BinModel
{
public string BinId { get; set; }
}
在你的控制器中
public ActionResult Index()
{
//load up your select list into the view bag
ViewBag.BinOptions = ViewHelper.PopulateBinList();
//preset the value of your desired object
var bm = new BinModel { BinId = "582" };
return View(bm);
}
在您的视图中,您将绑定到模型 属性,但使用在视图包中定义的临时列表来填充选项。预设模型的 属性 将自动 select select 列表中的默认值:
@Html.DropDownListFor(x => x.BinId, (IEnumerable<SelectListItem>)ViewBag.BinOptions, null, new { @class ="form-control" })
如果这没有意义或需要扩展,请告诉我。
我很确定 BindId 等于 0。如果 BindId 是一个简单的整数,那么默认情况下它将始终等于 0。您需要自己将其设置为 582 还是将其设置为 Integer?这会将默认值设置为 null。