【问题标题】:The parameter conversion from type 'System.String' to type ''X' failed because no type converter can convert between these types从类型“System.String”到类型“X”的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换
【发布时间】:2011-12-20 10:43:45
【问题描述】:

我被这个难住了,您的帮助将不胜感激。

我得到错误:

从类型'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>

【问题讨论】:

  • 尝试在您的 POST 操作中更改 FeedbackComment 参数名称。此外,您应该在 POST 操作中设置 CommentBy 和 CommentDate,而不是使用隐藏字段
  • 非常感谢您的二次提示。

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


【解决方案1】:

问题是你的动作参数的名称:

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);
}

【讨论】:

  • 啊,当然,仔细想想,这完全有道理。一直认为你会远离那些恶作剧,因为 c# 是区分大小写的。非常感谢。
  • 这个错误浪费了难以置信的时间。为您 +1,谢谢!
  • 这太难调试了,应该是编译器警告什么的。模型变量与内容相关并与其参数具有相同名称的可能性非常高。
  • 哇!在过去的 3 个小时里,我一直在解决与此类似的问题。非常感谢!
  • 确实“疯了”!
【解决方案2】:

我在 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)

【讨论】:

    【解决方案3】:

    我有同样的错误,但原因与接受的答案不同。添加自定义 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);
        }
    }
    

    全球.asax

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-07
        • 2018-04-07
        • 2018-02-15
        • 2019-01-27
        • 2020-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多