如何在 C# 中存储多项选择/下拉列表
how to store Multiple selction / Dropdownlist in C#
我是 MVC 和 C# 的新手,对于一个项目,我试图让用户从列表中选择多个城市,稍后将其存储到数据库中。我阅读了几篇关于此的帖子,但无法弄清楚如何解决我的问题。我可以存储表单的所有其他项目:
@using ( Html.BeginForm( "AddProjectInfo", "Insert", FormMethod.Post, new {
enctype = "multipart/form-data"
@id = "insertform", @class = "form-horizontal col-md-4 col-md-offset-4"
} ) )
但对于城市,它只存储第一个选择的项目,而不是全部。你能帮我解决这个问题吗?
这是我的观点:
<div class="form-group">
<label class="col-sm-3 col-form-label text-left">City * </label>
<div class="col-sm-9">
@Html.DropDownList(
"City",
new SelectListItem[] {
new SelectListItem {
Text = "Cambridge", Value = "Ca"
},
new SelectListItem {
Text = "Oxford", Value = "Ox"
},
new SelectListItem {
Text = "Sheffield", Value = "Sh"
}
},
"--Select Cities--",
new {
@class = "form-control",
required = true,
multiple = "multiple"
}
)
</div>
</div>
这是我的控制器:
[HttpPost]
public ActionResult Insert( FormCollection frm ) {
Models.ProjectInfo p = new Models.ProjectInfo();
String[] Cities= frm.GetValues( "City" );
p.ContractId = frm[ "ContractId" ];
p.Year = Convert.ToDecimal( frm[ "Year" ] );
p.City = Cities.ToString();
p.Location = frm[ "Location" ];
// Insert into the Database
AddProjectInfo( p );
ViewBag.ResponseMessage = "Submitted !";
}
我知道如何使用 JavaScript 做到这一点,但不知道 C# 如何处理。
谢谢!
@Html.ListBoxFor(m => m.location_code, Model.location_type)
[HttpPost]
public string SaveResults(List<int> location_code)
{
if (location_code!= null)
{
return string.Join(",", location_code);
}
else
{
return "No values are selected";
}
}
我会预先告诉您,我编写这些示例时并未对其进行测试,但这只是为了让您大致了解如何正确处理下拉列表/列表框。另外,最后,我会把 link 留给我的 GitHub,我有一个简单的项目,我前段时间专门为这种情况写的。
所以,让我们开始吧。为了简单起见,我宁愿在控制器中创建下拉列表。例如:
假设您有一个模型:
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
public string City { get; set; }
[NotMapped]
public SelectList CitySelectList { get; set; }
}
注意 CitySelectList
,这是 NotMapped
,因为我们不希望它连接到数据库。 CitySelectList
的值会通过City
保存到DB中
然后你有一个操作方法:
public ActionResult Insert()
{
var person = new Person { CitySelectList = new SelectList(
new List<SelectListItem>
{
new SelectListItem { Text = "Cambridge", Value = "Ca" },
new SelectListItem { Text = "Oxford", Value = "Ox" },
new SelectListItem { Text = "Sheffield", Value = "Sh" }
}, "Value", "Text") };
return View(person);
}
在这里您可以看到我正在创建 Person
的实例并将其传递给视图。这是加载具有预定义值的视图的最佳方式。在这种情况下,最重要的预定义值是下拉列表。
视图大致如下所示:
@model Person
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-group">
@Html.LabelFor(m => m.Name, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(m => m.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(m => m.Name, "", new { @class = "text-danger" })
</div>
<div class="form-group">
@Html.LabelFor(m => m.Surname, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(m => m.Surname, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(m => m.Surname, "", new { @class = "text-danger" })
</div>
<div class="form-group">
@Html.LabelFor(m => m.City, htmlAttributes: new { @class = "control-label" })
@* Important *@
@Html.EditorFor(m => m.CitySelectList, new { htmlAttributes = new { @class = "form-control", multiple = "multiple" } })
@* /Important *@
@Html.ValidationMessageFor(m => m.City, "", new { @class = "text-danger" })
</div>
}
如您所见,我通过传递 2 个 htmlAttributes 的 EditorFor 调用下拉列表。最重要的是 multiple = "multiple"
,因为它将定义我要在页面中显示的项目列表的类型。如何?通过专门为处理它而构建的编辑器模板。如果你不熟悉它的概念和用法,你可以检查 this website 开始。编辑器模板如下所示:
@model SelectList
@{
var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]);
}
@if (!htmlAttributes.ContainsKey("multiple"))
{
@Html.DropDownListFor(m => m.SelectedValue, Model.SelectListItems, htmlAttributes)
}
else
{
@Html.ListBoxFor(m => m.SelectedValues, Model.SelectListItems, htmlAttributes)
}
关于此特定编辑器模板的一个细节:您是否注意到我正在为 SelectedValue(s) 创建下拉列表/列表框?当您获得所有值时,这可能会引起一些麻烦,但您可以在 POST 方法中以这种方式处理:
[HttpPost]
public ActionResult Insert(Person person)
{
person.City = person.CitySelectList.SelectedValues;
// Some code goes here
return View();
}
应该是这样。但是,正如我之前所说,我有一个工作代码 here so you can run and see how it works. And also some explanation of that code from GitHub right here 以备不时之需。
我是 MVC 和 C# 的新手,对于一个项目,我试图让用户从列表中选择多个城市,稍后将其存储到数据库中。我阅读了几篇关于此的帖子,但无法弄清楚如何解决我的问题。我可以存储表单的所有其他项目:
@using ( Html.BeginForm( "AddProjectInfo", "Insert", FormMethod.Post, new {
enctype = "multipart/form-data"
@id = "insertform", @class = "form-horizontal col-md-4 col-md-offset-4"
} ) )
但对于城市,它只存储第一个选择的项目,而不是全部。你能帮我解决这个问题吗?
这是我的观点:
<div class="form-group">
<label class="col-sm-3 col-form-label text-left">City * </label>
<div class="col-sm-9">
@Html.DropDownList(
"City",
new SelectListItem[] {
new SelectListItem {
Text = "Cambridge", Value = "Ca"
},
new SelectListItem {
Text = "Oxford", Value = "Ox"
},
new SelectListItem {
Text = "Sheffield", Value = "Sh"
}
},
"--Select Cities--",
new {
@class = "form-control",
required = true,
multiple = "multiple"
}
)
</div>
</div>
这是我的控制器:
[HttpPost]
public ActionResult Insert( FormCollection frm ) {
Models.ProjectInfo p = new Models.ProjectInfo();
String[] Cities= frm.GetValues( "City" );
p.ContractId = frm[ "ContractId" ];
p.Year = Convert.ToDecimal( frm[ "Year" ] );
p.City = Cities.ToString();
p.Location = frm[ "Location" ];
// Insert into the Database
AddProjectInfo( p );
ViewBag.ResponseMessage = "Submitted !";
}
我知道如何使用 JavaScript 做到这一点,但不知道 C# 如何处理。 谢谢!
@Html.ListBoxFor(m => m.location_code, Model.location_type)
[HttpPost]
public string SaveResults(List<int> location_code)
{
if (location_code!= null)
{
return string.Join(",", location_code);
}
else
{
return "No values are selected";
}
}
我会预先告诉您,我编写这些示例时并未对其进行测试,但这只是为了让您大致了解如何正确处理下拉列表/列表框。另外,最后,我会把 link 留给我的 GitHub,我有一个简单的项目,我前段时间专门为这种情况写的。
所以,让我们开始吧。为了简单起见,我宁愿在控制器中创建下拉列表。例如:
假设您有一个模型:
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
public string City { get; set; }
[NotMapped]
public SelectList CitySelectList { get; set; }
}
注意 CitySelectList
,这是 NotMapped
,因为我们不希望它连接到数据库。 CitySelectList
的值会通过City
然后你有一个操作方法:
public ActionResult Insert()
{
var person = new Person { CitySelectList = new SelectList(
new List<SelectListItem>
{
new SelectListItem { Text = "Cambridge", Value = "Ca" },
new SelectListItem { Text = "Oxford", Value = "Ox" },
new SelectListItem { Text = "Sheffield", Value = "Sh" }
}, "Value", "Text") };
return View(person);
}
在这里您可以看到我正在创建 Person
的实例并将其传递给视图。这是加载具有预定义值的视图的最佳方式。在这种情况下,最重要的预定义值是下拉列表。
视图大致如下所示:
@model Person
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-group">
@Html.LabelFor(m => m.Name, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(m => m.Name, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(m => m.Name, "", new { @class = "text-danger" })
</div>
<div class="form-group">
@Html.LabelFor(m => m.Surname, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(m => m.Surname, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(m => m.Surname, "", new { @class = "text-danger" })
</div>
<div class="form-group">
@Html.LabelFor(m => m.City, htmlAttributes: new { @class = "control-label" })
@* Important *@
@Html.EditorFor(m => m.CitySelectList, new { htmlAttributes = new { @class = "form-control", multiple = "multiple" } })
@* /Important *@
@Html.ValidationMessageFor(m => m.City, "", new { @class = "text-danger" })
</div>
}
如您所见,我通过传递 2 个 htmlAttributes 的 EditorFor 调用下拉列表。最重要的是 multiple = "multiple"
,因为它将定义我要在页面中显示的项目列表的类型。如何?通过专门为处理它而构建的编辑器模板。如果你不熟悉它的概念和用法,你可以检查 this website 开始。编辑器模板如下所示:
@model SelectList
@{
var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]);
}
@if (!htmlAttributes.ContainsKey("multiple"))
{
@Html.DropDownListFor(m => m.SelectedValue, Model.SelectListItems, htmlAttributes)
}
else
{
@Html.ListBoxFor(m => m.SelectedValues, Model.SelectListItems, htmlAttributes)
}
关于此特定编辑器模板的一个细节:您是否注意到我正在为 SelectedValue(s) 创建下拉列表/列表框?当您获得所有值时,这可能会引起一些麻烦,但您可以在 POST 方法中以这种方式处理:
[HttpPost]
public ActionResult Insert(Person person)
{
person.City = person.CitySelectList.SelectedValues;
// Some code goes here
return View();
}
应该是这样。但是,正如我之前所说,我有一个工作代码 here so you can run and see how it works. And also some explanation of that code from GitHub right here 以备不时之需。