MVC 5下拉列表模型声明类型' System.String'输入' Namespace.Models.Entity'

时间:2015-07-09 16:50:56

标签: asp.net-mvc entity-framework asp.net-mvc-5 html.dropdownlistfor modelbinders

我是MVC的新手,我开始理解并开发一个RL(简单)应用程序,但是我坚持创建一个记录,我似乎无法发布我的表单内容,因为这个错误:

  

"参数转换类型' System.String'输入   ' Namespace.Models.Entity'因为没有转换器可以进行此转换"

在我的一个字段上,但是,还有另一个带有下拉列表的字段也可以正常工作,也许是因为其中一个字段是模型中的导航关系? 该模型适用于Questionnare应用程序  这是主要的问题模型: (用EF数据库生成)

    public partial class QuestionContent
{
    public QuestionContent()
    {
        this.QuestionTranslations = new HashSet<QuestionTranslations>();
        this.QuestionMedicalCategory = new HashSet<QuestionMedicalCategory>();
        this.QuestionCategory = new HashSet<QuestionCategory>();
        this.QuestionContent1 = new HashSet<QuestionContent>();
    }

    public int QItemId { get; set; }
    public string Language { get; set; }
    public string Content { get; set; }
    public Nullable<int> ParentQId { get; set; }

    public virtual ICollection<QuestionTranslations> QuestionTranslations {       get; set; }
    public virtual ICollection<QuestionMedicalCategory>      QuestionMedicalCategory { get; set; }
    public virtual ICollection<QuestionCategory> QuestionCategory { get; set; }
    public virtual ICollection<QuestionContent> QuestionContent1 { get; set; }
    public virtual QuestionContent QuestionContent2 { get; set; }
}

类别模型就是这个:

namespace AskusOnlinePrototype.Models{
using System;
using System.Collections.Generic;

public partial class QuestionCategory
{
    public QuestionCategory()
    {
        this.QuestionContent = new HashSet<QuestionContent>();
    }

    public int CategoryId { get; set; }
    public string CategoryDescription { get; set; }

    public virtual ICollection<QuestionContent> QuestionContent { get; set; }
}}

我的&#34;创建&#34;控制器(我复制了dropdownList实现,看到了在模型状态中没有产生任何错误的ParentQId Viewbag SelectList)

public ActionResult Create()
    {

        ViewBag.QuestionCategory = new SelectList(db.QuestionCategory, "CategoryId", "CategoryDescription");
ViewBag.ParentQId = new SelectList(db.QuestionContent, "QItemId", "Content");//Generated by VS
        ViewBag.DefaultLanguage = "EN";
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "Language,Content,ParentQId,QuestionMedicalCategory,QuestionCategory")] QuestionContent questionContent)
    {
        try
        {
            if (ModelState.IsValid)
            {
                db.QuestionContent.Add(questionContent);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
        }
        catch (DataException /* dex */)
        {

            ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
        }

        ViewBag.QuestionCategory = new SelectList(db.QuestionCategory, "CategoryId", "CategoryDescription");
        ViewBag.ParentQId = new SelectList(db.QuestionContent, "QItemId", "Content");

            ViewBag.DefaultLanguage = "EN";
            return View(questionContent);



    }

我的创建视图(简化显示问题)

@using (Html.BeginForm()) {
@Html.AntiForgeryToken()

     @Html.LabelFor(model => model.QuestionCategory,"Item Category") 

@Html.DropDownListFor(m => m.QuestionCategory,null, "Select Category")


//This DropDownListFor implementation does not generate errors in modelstate        
@Html.LabelFor(model => model.ParentQId, "Select Parent ")

            @Html.DropDownListFor(m=>m.ParentQId, null," -- None --")


        </div>
    </div>

我已经研究了SO中的几个问题并且已经解决了这个问题几天了但是我放弃了,因为他们大多数都处理更复杂的模型,或者多选列表,我的意思是,这应该很简单!我的问题是,我知道DefaultModelBinder看到这些字段(因为medicalCategory给了我同样的问题,但我认为解决这个问题也将修复medicalCategory,因为在模型状态下它显示&#34;预期值&#34;例如&#39; 1&#39;在给定的选择的问题类别中,那么,当DropDownLists绑定到导航关系时,我是否应该做些什么,是否需要修改模型绑定器?如果有,请你帮我到哪里开始理解表格帖子如何与这些观点一起工作?我发现的最相似的问题是[MVC Model State Validation fails on Listbox,但对于我的简单模型来说答案似乎过于紧张,不过,如果你认为它的话正确答案,请指出我。

谢谢,如果你不知道答案,但想知道我应该研究什么,我也很感激!

2 个答案:

答案 0 :(得分:0)

我相信你引用的另一个问题是现场。您需要为复杂类型构建转换器或执行类似

的操作
@Html.DropDownListFor(m => m.QuestionCategory.CategoryId,null, "Select Category")

答案 1 :(得分:-1)

对于任何可能偶然发现这个问题的人来说,如上所述,对应于类似问题的问题似乎来自于SelectList中的Select项包含一系列值,在大多数情况下不能被转换为模型中的复杂类型,在我的例子中是Icollection到另一个模型。这是我未知的例外的性质和模型以及提交的值的绑定,在这种情况下,需要创建一个类型转换器,但在某些情况下,我发现更建议建立一个自定义模型绑定器,因为SelectList中的值甚至没有指向模型中的值,它们来自viewbag List。  在我的情况下,我制作了一个自定义模型绑定器,其中我将这些值与foreach一起使用,将它们添加到Icollection&lt;&gt;,如果您需要一些帮助开始使用自定义模型绑定器,我会留下这个链接Creating a Custom Model Binder in MVC