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。

c#为什么不能系统.使用"DropDownListFor"时转换的字符串

在控制器中:将选择项列表添加到视图模型中,而不是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
            );
    }