DropDownListFor - 需要帮助定义 "SelectedValue" 属性
DropDownListFor - need help defining "SelectedValue" property
我需要帮助了解如何在 HTML.DropDownListFor
中设置 SelectedValue
属性。
这是我目前的情况:
在模型的另一部分,MA 是存储在数据库中的 int
。
模型中:
public IList<SelectListItem> SelectListMA(int MA)
{
IList < SelectListItem > List = new List<SelectListItem>();
SelectListItem Item;
for(int i = 1; i <= 9; i++)
{
Item = new SelectListItem
{
Value = i.ToString(),
Text = i.ToString(),
Selected = i == MA
};
List.Add(Item);
}
return List;
}
在控制器中:
ViewBag.MA = _Repository.SelectListMA(5);
最后,在视图中:
@Html.DropDownListFor(model => model.MA, new SelectList(ViewBag.MA, dataValueField: "Value", dataTextField: "Text"))
在视图中,下拉列表显示正常,但未设置默认值,我正在使用模型将原始模型传递给 View
,因此使用 ViewBag
编辑:需要更多详细信息 - 这是它所属的完整控制器。
private readonly IRacesRepos _RaceRepository;
public BaseTeamsController(IRacesRepos _Repository)
{
_RaceRepository = _Repository;
}
//sets the Model to the repository
public BaseTeamsController() : this(new ModelRaces()) { }
public ActionResult BEditPlayer(int ID)
{
Races_Players SelectedPlayer = _RaceRepository.GetPlayerBase(ID);
ViewBag.MA = _RaceRepository.SelectListMA(SelectedPlayer.MA);
ViewBag.ST = _RaceRepository.SelectListST(SelectedPlayer.ST);
ViewBag.AG = _RaceRepository.SelectListAG(SelectedPlayer.AG);
ViewBag.PA = _RaceRepository.SelectListPA((int)SelectedPlayer.PA);
ViewBag.AV = _RaceRepository.SelectListAV(SelectedPlayer.AV);
ViewBag.Race = _RaceRepository.GetRaceBase(SelectedPlayer.RaceID);
return View(SelectedPlayer);
}
我使用的是 MVC 版本 5,ModelRaces 是包含代码的模型的名称,MA 是数据库中模型中的一个 int。
全景
@model BB2020MVC.Models.Races_Players
@{
ViewBag.Title = "Add Player to " + ViewBag.RaceName;
}
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Add Player to @ViewBag.RaceName</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.PlayerID)
@Html.HiddenFor(model => model.RaceID)
<div class="form-group">
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10 focus">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.MA, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.MA, new SelectList(ViewBag.MA, dataTextField: "Text", dataValueField:"Value") , new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.MA, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.ST, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.ST, new SelectList(ViewBag.ST, dataTextField: "Text", dataValueField: "Value"), new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.ST, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.AG, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.AG, new SelectList(ViewBag.AG, dataTextField: "Text", dataValueField: "Value"), new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.AG, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.PA, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.PA, new SelectList(ViewBag.PA, dataTextField: "Text", dataValueField: "Value") ,new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.PA, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.AV, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.AV, new SelectList(ViewBag.AV, dataTextField: "Text", dataValueField: "Value") ,new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.AV, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Cost, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Cost, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Cost, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.MaxQTY, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.MaxQTY, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.MaxQTY, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Cancel", "ViewRace", new { ID = Model.RaceID })
</div>
编辑:进行了一些测试和阅读,问题似乎是视图未选择 model => model.MA
的选定值,但编辑时该值不为空,因此已选择任何值通过 SelectListItem
或 SelectList
将被忽略。
此外,将除数字或单词(例如“1”或“Word”,而不是 int 或 string 类型的变量)之外的任何值传递给 selectedValue
都会导致该项目未被选中。
没有解决问题,但有趣的一点。
试试这个语法:
在视图中
@Html.DropDownListFor(model => model.MA, ViewBag.MA,"Select One", new { htmlAttributes = new { @class = "form-control" } })
存储库中:
public SelectList SelectListMA(int MA)
{
var List = new List<SelectListItem>();
for(int i = 1; i <= 9; i++)
{
List.Add(new SelectListItem
{
Value = i.ToString(),
Text = i.ToString(),
});
}
return new SelectList(list, "Value", "Text",MA);
}
但是您不需要将现有列表转换为 SelectListItem 列表。
只需使用 retun new SelectList(yourlist, "yourvalueproperty", "yourtextproperty",);
这个问题的答案就在键盘和屏幕之间。
让我解释一下:
在附加测试中,我错误地将 _RaceRepository.GetPlayerBase(ID)
更改为另一个为记录生成新基数的函数。 (即兴突变测试!)
这意味着每次我尝试编辑播放器时,我都会将默认值“1”传递给视图,并在提交时编辑一个根本不存在的模型。
设置正确的函数后,我得到了正确的值,因此所选值的设置自行解决。
不过,我要感谢 Sergey 查看并尝试提供帮助,并提供了提供 SelectList 的更好方法(更好的版本是使用 ViewModel,另一部分必须使用它)。
所以对于那些感兴趣的人,这里是解决这个问题的代码:
来自模特:
public SelectList SelectListMA()
{
IList<SelectListItem> List = new List<SelectListItem>();
SelectListItem Item;
for(int i = 1; i <=9; i++)
{
Item = new SelectListItem()
{
Value = i.ToString(),
Text = i.ToString()
};
List.Add(Item);
}
return new SelectList(List,"Value","Text");
}
来自控制器:
public ActionResult BEditPlayer(int ID)
{
Races_Players SelectedPlayer = _RaceRepository.GetPlayerBase(ID);
ViewBag.MASelect = _RaceRepository.SelectListMA();
ViewBag.STSelect = _RaceRepository.SelectListST();
ViewBag.AGSelect = _RaceRepository.SelectListAG();
ViewBag.PASelect = _RaceRepository.SelectListPA();
ViewBag.AVSelect = _RaceRepository.SelectListAV();
return View(SelectedPlayer);
}
从视图中:- 因为 SelectList 是为了阻止在构建代码时发生错误
@Html.DropDownListFor(model => model.MA, ViewBag.MASelect as SelectList, "Select One")
此外,根据研究和测试,对于任何新程序员,SelectList
和 SelectListItem
分别有 SelectedValue
和 Selected
用于选择默认值。
SelectedValue
可以是标识列表主键的任何对象或列表的新默认值 (例如,整数表示列表中已有的值,或字符串默认值为 null).
然而,Selected
是一个布尔值(即 true 或 false),用于选择列表的值。您只需要使用其中之一。
记住 - 如果值作为 model => model.[Variable]
中的值从控制器传递到视图,那么该值将被设置为传递的值,而不是 SelectedValue
或Selected
.
我需要帮助了解如何在 HTML.DropDownListFor
中设置 SelectedValue
属性。
这是我目前的情况:
在模型的另一部分,MA 是存储在数据库中的 int
。
模型中:
public IList<SelectListItem> SelectListMA(int MA)
{
IList < SelectListItem > List = new List<SelectListItem>();
SelectListItem Item;
for(int i = 1; i <= 9; i++)
{
Item = new SelectListItem
{
Value = i.ToString(),
Text = i.ToString(),
Selected = i == MA
};
List.Add(Item);
}
return List;
}
在控制器中:
ViewBag.MA = _Repository.SelectListMA(5);
最后,在视图中:
@Html.DropDownListFor(model => model.MA, new SelectList(ViewBag.MA, dataValueField: "Value", dataTextField: "Text"))
在视图中,下拉列表显示正常,但未设置默认值,我正在使用模型将原始模型传递给 View
,因此使用 ViewBag
编辑:需要更多详细信息 - 这是它所属的完整控制器。
private readonly IRacesRepos _RaceRepository;
public BaseTeamsController(IRacesRepos _Repository)
{
_RaceRepository = _Repository;
}
//sets the Model to the repository
public BaseTeamsController() : this(new ModelRaces()) { }
public ActionResult BEditPlayer(int ID)
{
Races_Players SelectedPlayer = _RaceRepository.GetPlayerBase(ID);
ViewBag.MA = _RaceRepository.SelectListMA(SelectedPlayer.MA);
ViewBag.ST = _RaceRepository.SelectListST(SelectedPlayer.ST);
ViewBag.AG = _RaceRepository.SelectListAG(SelectedPlayer.AG);
ViewBag.PA = _RaceRepository.SelectListPA((int)SelectedPlayer.PA);
ViewBag.AV = _RaceRepository.SelectListAV(SelectedPlayer.AV);
ViewBag.Race = _RaceRepository.GetRaceBase(SelectedPlayer.RaceID);
return View(SelectedPlayer);
}
我使用的是 MVC 版本 5,ModelRaces 是包含代码的模型的名称,MA 是数据库中模型中的一个 int。
全景
@model BB2020MVC.Models.Races_Players
@{
ViewBag.Title = "Add Player to " + ViewBag.RaceName;
}
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Add Player to @ViewBag.RaceName</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.PlayerID)
@Html.HiddenFor(model => model.RaceID)
<div class="form-group">
@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10 focus">
@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.MA, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.MA, new SelectList(ViewBag.MA, dataTextField: "Text", dataValueField:"Value") , new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.MA, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.ST, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.ST, new SelectList(ViewBag.ST, dataTextField: "Text", dataValueField: "Value"), new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.ST, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.AG, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.AG, new SelectList(ViewBag.AG, dataTextField: "Text", dataValueField: "Value"), new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.AG, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.PA, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.PA, new SelectList(ViewBag.PA, dataTextField: "Text", dataValueField: "Value") ,new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.PA, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.AV, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(model => model.AV, new SelectList(ViewBag.AV, dataTextField: "Text", dataValueField: "Value") ,new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.AV, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Cost, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Cost, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Cost, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.MaxQTY, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.MaxQTY, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.MaxQTY, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Cancel", "ViewRace", new { ID = Model.RaceID })
</div>
编辑:进行了一些测试和阅读,问题似乎是视图未选择 model => model.MA
的选定值,但编辑时该值不为空,因此已选择任何值通过 SelectListItem
或 SelectList
将被忽略。
此外,将除数字或单词(例如“1”或“Word”,而不是 int 或 string 类型的变量)之外的任何值传递给 selectedValue
都会导致该项目未被选中。
没有解决问题,但有趣的一点。
试试这个语法:
在视图中
@Html.DropDownListFor(model => model.MA, ViewBag.MA,"Select One", new { htmlAttributes = new { @class = "form-control" } })
存储库中:
public SelectList SelectListMA(int MA)
{
var List = new List<SelectListItem>();
for(int i = 1; i <= 9; i++)
{
List.Add(new SelectListItem
{
Value = i.ToString(),
Text = i.ToString(),
});
}
return new SelectList(list, "Value", "Text",MA);
}
但是您不需要将现有列表转换为 SelectListItem 列表。 只需使用 retun new SelectList(yourlist, "yourvalueproperty", "yourtextproperty",);
这个问题的答案就在键盘和屏幕之间。
让我解释一下:
在附加测试中,我错误地将 _RaceRepository.GetPlayerBase(ID)
更改为另一个为记录生成新基数的函数。 (即兴突变测试!)
这意味着每次我尝试编辑播放器时,我都会将默认值“1”传递给视图,并在提交时编辑一个根本不存在的模型。
设置正确的函数后,我得到了正确的值,因此所选值的设置自行解决。
不过,我要感谢 Sergey 查看并尝试提供帮助,并提供了提供 SelectList 的更好方法(更好的版本是使用 ViewModel,另一部分必须使用它)。
所以对于那些感兴趣的人,这里是解决这个问题的代码:
来自模特:
public SelectList SelectListMA()
{
IList<SelectListItem> List = new List<SelectListItem>();
SelectListItem Item;
for(int i = 1; i <=9; i++)
{
Item = new SelectListItem()
{
Value = i.ToString(),
Text = i.ToString()
};
List.Add(Item);
}
return new SelectList(List,"Value","Text");
}
来自控制器:
public ActionResult BEditPlayer(int ID)
{
Races_Players SelectedPlayer = _RaceRepository.GetPlayerBase(ID);
ViewBag.MASelect = _RaceRepository.SelectListMA();
ViewBag.STSelect = _RaceRepository.SelectListST();
ViewBag.AGSelect = _RaceRepository.SelectListAG();
ViewBag.PASelect = _RaceRepository.SelectListPA();
ViewBag.AVSelect = _RaceRepository.SelectListAV();
return View(SelectedPlayer);
}
从视图中:- 因为 SelectList 是为了阻止在构建代码时发生错误
@Html.DropDownListFor(model => model.MA, ViewBag.MASelect as SelectList, "Select One")
此外,根据研究和测试,对于任何新程序员,SelectList
和 SelectListItem
分别有 SelectedValue
和 Selected
用于选择默认值。
SelectedValue
可以是标识列表主键的任何对象或列表的新默认值 (例如,整数表示列表中已有的值,或字符串默认值为 null).
然而,Selected
是一个布尔值(即 true 或 false),用于选择列表的值。您只需要使用其中之一。
记住 - 如果值作为 model => model.[Variable]
中的值从控制器传递到视图,那么该值将被设置为传递的值,而不是 SelectedValue
或Selected
.