我是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,但对于我的简单模型来说答案似乎过于紧张,不过,如果你认为它的话正确答案,请指出我。
谢谢,如果你不知道答案,但想知道我应该研究什么,我也很感激!
答案 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