C# 如何在C中存储多个Selection/Dropdownlist#
我是MVC和C的新手,对于一个项目,我试图让用户从列表中选择多个城市,然后将其存储到DB中。我读了几篇关于这个的帖子,但不知道如何修复我的。我可以存储表单的所有其他项:C# 如何在C中存储多个Selection/Dropdownlist#,c#,asp.net-mvc,formcollection,C#,Asp.net Mvc,Formcollection,我是MVC和C的新手,对于一个项目,我试图让用户从列表中选择多个城市,然后将其存储到DB中。我读了几篇关于这个的帖子,但不知道如何修复我的。我可以存储表单的所有其他项: @using ( Html.BeginForm( "AddProjectInfo", "Insert", FormMethod.Post, new { enctype = "multipart/form-data" @id = "insertform", @class = "form-horizo
@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>
我知道如何使用JavaScript实现这一点,但不知道C#如何处理这一点。
谢谢你 @Html.ListBoxFor(m=>m.location\u代码,Model.location\u类型)
@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";
}
}
[HttpPost]
公共字符串保存结果(列表位置\u代码)
{
如果(位置代码!=null)
{
返回字符串。Join(“,”,位置\代码);
}
其他的
{
返回“未选择任何值”;
}
}
我会预先告诉您,我编写这些示例时没有对其进行测试,但这只是为了让您大致了解如何正确使用下拉列表/列表框。另外,最后,我将留下我的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);
}
正如你所见,我通过一个编辑器调用下拉列表来传递2个htmlAttributes。最重要的是multiple=“multiple”
,因为这将定义我将在页面中显示的项目列表的类型。怎么用?通过专门为处理它而构建的编辑器模板。如果您不熟悉它的概念和用法,可以检查start。编辑器模板如下所示:
@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创建下拉列表/列表框?当您获取所有值时,这可能会引起一点头痛,但您可以在POST方法中通过以下方式处理:
[HttpPost]
public ActionResult Insert(Person person)
{
person.City = person.CitySelectList.SelectedValues;
// Some code goes here
return View();
}
应该是这样。但是,正如我之前所说,我有一个工作代码,所以您可以运行并查看它是如何工作的。如果您需要,还可以从GitHub中对该代码进行一些解释。public ActionResult Insert(FormCollection frm)这应该是一个真实的模型,具有与HTMLD中的输入相对应的字段,不要将
DropDownList()
与多个-使用ListBoxFor()
(请参阅)。切勿使用FormCollection
。创建视图模型并绑定到属性-请参阅典型实现使用new SelectList(…)
从第一个视图创建第二个相同的IEnumerable
是毫无意义的。这不提供客户端或服务器端验证,在编辑现有数据时不能用于正确的双向模型绑定,不会设置城市的值(SelectedValues
为IEnumerable
),在返回视图()时将丢失所有选项是的,但正如我在第一行中所说,“(…)我编写这些示例时没有对其进行测试,但这只是给您一个总体思路(…)”。总体思路是强绑定到模型属性(在OP的情况下,它将是IEnumerable SelectedCities
,而不是selectedvalue
属性的selectedlist
:)
@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)
}
[HttpPost]
public ActionResult Insert(Person person)
{
person.City = person.CitySelectList.SelectedValues;
// Some code goes here
return View();
}