从类型’System.String’到类型”X’的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换
我对这个感到难过,你的帮助最有用。
我收到错误:
从类型’System.String’到类型’DataPortal.Models.EntityClasses.FeedbackComment’的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换
ModelState.IsValid
在FeedbackComment.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) } @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
数据类型并且我传递了一个自定义类名,所以它失败了。