从类型’System.String’到类型”X’的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换

我对这个感到难过,你的帮助最有用。

我收到错误:

从类型’System.String’到类型’DataPortal.Models.EntityClasses.FeedbackComment’的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换

ModelState.IsValidFeedbackComment.Comment属性上失败

有任何想法吗?

 public class FeedbackComment : IFeedbackComment { [Key] public int Id { get; set;} public int FeedbackId { get; set; } [Required(ErrorMessage = "Please enter a Comment")] public string Comment { get; set; } public DateTime CommentDate { get; set; } public string CommentBy { get; set; } } 

控制器方法

 // // GET: /FeedbackComment/Create public virtual ActionResult Create(int feedbackId) { var comment = new FeedbackComment {FeedbackId = feedbackId, CommentBy = User.Identity.Name, CommentDate = DateTime.Now}; return View(comment); } // // POST: /FeedbackComment/Create [HttpPost] public virtual ActionResult Create(FeedbackComment comment) { if (ModelState.IsValid) { _feedbackCommentRepository.Add(comment); return RedirectToAction(MVC.Feedback.Details(comment.FeedbackId)); } return View(comment); } 

和观点

 @model DataPortal.Models.EntityClasses.FeedbackComment @{ ViewBag.Title = "Create Comment"; } 

Create Comment

 @using (Html.BeginForm()) { @Html.ValidationSummary(true) 
Feedback Comment
@Html.LabelFor(model => model.Comment)
@Html.TextAreaFor(model => model.Comment, new{@class = "TextEditor"}) @Html.ValidationMessageFor(model => model.Comment)
@Html.HiddenFor(model=> model.CommentDate) @Html.HiddenFor(model=> model.CommentBy) @Html.HiddenFor(model=> model.FeedbackId)

}
@Html.ActionLink("Back to Comment Details", MVC.Feedback.Details(Model.FeedbackId))

问题是您的action参数的名称:

 public virtual ActionResult Create(FeedbackComment comment) 

这叫做comment 。 但是您的FeedbackComment还有一个名为Comment of type string的属性。 所以默认的模型绑定器变得疯狂。 只需重命名其中一个以避免冲突。

例如,以下内容将解决您的问题:

 public virtual ActionResult Create(FeedbackComment model) { if (ModelState.IsValid) { _feedbackCommentRepository.Add(model); return RedirectToAction(MVC.Feedback.Details(model.FeedbackId)); } return View(model); } 

我在GET方法上的参数名称相同

 [HttpGet] public ActionResult Create(int OSSB) 

..和Faturamento模型的属性,用于POST方法

 [HttpPost] public ActionResult Create(Faturamento model) 

像这样..

 public class Faturamento { [Column("ID_OSSB")] public virtual int ID_OSSB { get; set; } [ForeignKey("ID_OSSB")] public virtual OSSB OSSB { get; set; } ... } 

为我解决的是更改GET参数名称:

 [HttpGet] public ActionResult Create(int IDOSSB) 

我有同样的错误,但原因与接受的答案不同。 添加自定义ModelBinder为我修复了它。

我创建了一个如此处所述的CData

如何使用XmlSerializer将字符串序列化为CDATA? (这是最后的答案,除非它被投票,因为它是一个很好的解决方案)

我将ViewModel序列化为XML。 当我在ViewModel中的属性中将类型设置为CData ,它将自动序列化为CData部分并反序列化为CData字段。 (太棒了!)

当我在视图中执行post操作时,我想在ViewModel中保留一些字段,以便在表单Html.HiddenFor它们添加为Html.HiddenFor

提交完成后,会发生错误(标题中的错误)。 模型绑定器尝试将字符串字段绑定到失败的CData字段。

CData类型的自定义模型绑定器修复了此问题

 public class CDataModelBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); return new CData(result.AttemptedValue); } } 

Global.asax中

  ModelBinders.Binders.Add(typeof(CData), new CDataModelBinder()); 

在我的例子中,我在Html Helper类中编写了一个模型类名。 因为它期待System.String数据类型并且我传递了一个自定义类名,所以它失败了。