0

首先,我的观点是创建一个项目。用户将能够从下拉列表中选择该项目的父项目。当用户选择项目的父项目时,应将其作为父项目属性保存到数据库(db)中。

我的错误消息如下。

[System.InvalidOperationException] = {“从类型'System.String'到类型'ProjectName.Models.Project'的参数转换失败,因为没有类型转换器可以在这些类型之间转换。”}

我的 ProjectsController 操作:

    //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);
    }

我的项目类:

 public class Project{

    public int projectID { get; set; }


    public string projectName { get; set; }


    public string descriptionProject { get; set; }

    public Project parentProject { get; set; }
 }

我的上下文类:

public class DBContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Project> Projects { get; set; }
    public DbSet<Issue> Issues { get; set; }
}

最后是我的观点:

        @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 update 2。

4

1 回答 1

1

在您的控制器中:将选择项列表添加到您的视图模型而不是 viewBag 或视图数据,因为它们不是强类型的。这样做是一个好习惯。不要在 HtmlHelper 中转换。

顺便说一句,这是我创建的一个通用方法,用于在我的一个项目中填充下拉列表。您甚至可以附加静态值,例如 All 或 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
            );
    }
于 2014-08-12T16:45:27.637 回答