c#为什么不能系统.使用"DropDownListFor"时转换的字符串
本文关键字:quot 转换 字符串 DropDownListFor 为什么 使用 不能 系统 | 更新日期: 2023-09-27 18:17:35
首先,我的重点是创建一个项目。用户可以从下拉列表中选择这个项目的父项目。当用户选择项目的父项目时,它应该作为父项目属性保存到数据库(db)中。
My error Message is below.
[系统。InvalidOperationException] ={"从类型'System '转换过来的参数。字符串'到类型'ProjectName.Models。项目失败,因为没有类型转换器可以在这些类型之间进行转换。"}
my ProjectsController Actions:
//GET
public ActionResult Create()
{
var projectList = db.Projects.ToList().Select(
c => new SelectListItem
{
Selected = false,
Text = c.projectName,
Value = c.projectID.ToString()
}
).ToList();
ViewData["ProjectList"] = projectList;
return View();
}
//
// POST: /Project/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Project project)
{
var projectList = db.Projects.ToList().Select(
c => new SelectListItem
{
Selected = false,
Text = c.projectName,
Value = c.projectID.ToString()
}
).ToList();
ViewData["ProjectList"] = projectList;
if (ModelState.IsValid)
{
db.Projects.Add(project);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(project);
}
my Project class:
public class Project{
public int projectID { get; set; }
public string projectName { get; set; }
public string descriptionProject { get; set; }
public Project parentProject { get; set; }
}
my Context class:
public class DBContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Project> Projects { get; set; }
public DbSet<Issue> Issues { get; set; }
}
最后是my view
@model ProjectName.Models.Project
....
<div class="form-group">
@Html.LabelFor(model => model.parentProject, new { @class = "col-lg-2 control-label" })
<div class="col-lg-10">
<p>@Html.DropDownListFor(model => model.projectID, (IEnumerable<SelectListItem>)ViewData["ProjectList"], " --Select Parent Project--")</p>
@Html.ValidationMessageFor(model => model.parentProject)
</div>
</div>
我在等待你的回复。提前感谢。顺便说一下,我使用mvc 5.2, visual studio 2013更新2。
在控制器中:将选择项列表添加到视图模型中,而不是viewBag或视图数据,因为它们不是强类型的。这样做是一种很好的做法。不要在HtmlHelper中进行转换。
顺便说一下,这是我创建的一个通用方法,用于在我的一个项目中填充下拉列表。您甚至可以附加静态值,如All or Nothing。 public IEnumerable<SelectListItem> GetSelection<T>(IEnumerable<T> data,
Func<T, string> name = null,
Func<T, string> key = null,
string defaultValue = "0",
bool showAllValue = true,
bool showNothing = false)
{
var selectItemList = new List<SelectListItem>();
if (showAllValue)
{
selectItemList.Add(new SelectListItem { Text = "Choose All", Value = 0 });
}
if (showNothing)
{
selectItemList.Add(new SelectListItem { Text = "Nothing Selected", Value = -1 });
}
selectItemList.AddRange(data.Select(item => key != null ? (name != null ? new SelectListItem
{
Text = name(item),
Value = key(item)
} : null) : null));
//default selection
var defaultItem = selectItemList.FirstOrDefault(x => x.Value == defaultValue);
if (defaultItem != null)
{
defaultItem.Selected = true;
}
else
{
var firstItem = selectItemList.FirstOrDefault();
if (firstItem != null) firstItem.Selected = true;
}
return selectItemList;
}
你可以这样调用它:
public IEnumerable<SelectListItem> GetClientSelectionList(string defaultClient = "0", bool showAllValue = false)
{
return this.GetSelection(data: _clientsManager.GetClients(),
name: s => s.Client_Name,
key: s => s.Client_ID.ToString(CultureInfo.InvariantCulture),
defaultValue: defaultClient,
showAllValue: showAllValue
);
}