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

时间:2011-11-02 15:33:53

标签: c# .net asp.net-mvc-3 razor

我对这个感到困惑,你的帮助最有用。

我收到错误:

  

从类型'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";
}
<h2>Create Comment</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
    <legend>Feedback Comment</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.Comment)
    </div>
    <div class="editor-field">
        @Html.TextAreaFor(model => model.Comment, new{@class = "TextEditor"})
        @Html.ValidationMessageFor(model => model.Comment)
    </div>


    @Html.HiddenFor(model=> model.CommentDate)
    @Html.HiddenFor(model=> model.CommentBy)       
    @Html.HiddenFor(model=> model.FeedbackId)

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

<div>
@Html.ActionLink("Back to Comment Details", MVC.Feedback.Details(Model.FeedbackId))
</div>

4 个答案:

答案 0 :(得分:74)

问题是您的操作参数的名称:

public virtual ActionResult Create(FeedbackComment comment)

它被称为comment。但是您的FeedbackComment也有一个名为Comment的字符串属性。所以默认的模型绑定器变得疯狂。只需重命名其中一个以避免冲突。

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

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

答案 1 :(得分:1)

我在GET方法

上的参数名称相同
[HttpPost]
public ActionResult Create(Faturamento model)

..以及来自Faturamento模型的属性,用于POST方法

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

就像这样..

[HttpGet]
public ActionResult Create(int IDOSSB)

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

function setListeners(enable) {
    const fn = enable ? document.body.addEventListener : document.body.removeEventListener;

    fn('click', foo);
    fn('MyCustomEvent', bar);
}

答案 2 :(得分:0)

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

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

How do you serialize a string as CDATA using XmlSerializer?(它是最后一个答案,除非它被投票,因为它是一个很好的解决方案)

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

当我在我的视图中执行帖子操作时,我想在我的ViewModel中保留一些字段,以便将它们添加为表单中的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());

答案 3 :(得分:0)

就我而言,我正在Html Helper类中编写模型类名称。由于期望System.String数据类型而导致失败,并且我正在传递自定义类名。