2011-11-02 15 views
27

私はこの1つで困惑しており、'System.String'型から '' X '型へのパラメータ変換は、型変換器がこれらの型の間で変換できないため失敗しました

私はエラーを取得する:

The parameter conversion from type 'System.String' to type 'DataPortal.Models.EntityClasses.FeedbackComment' failed because no type converter can convert between these types

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"; 
} 
<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> 
+2

:とPOSTメソッドただ、このような

[HttpPost] public ActionResult Create(Faturamento model) 

に使用されたFaturamentoモデルからプロパティ...

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

私のために解決は何がGETパラメータ名を変更しました。 POSTアクションでFeedbackCommentパラメータ名を変更してみてください。また、隠しフィールドを使用するのではなく、POSTアクションでCommentByとCommentDateを設定する必要があります。 – epzee

+0

2次チップをありがとうございます。 – MrBliz

答えて

62

問題は、あなたのアクション・パラメータの名前です:

public virtual ActionResult Create(FeedbackComment comment) 

commentと呼ばれています。しかし、FeedbackCommentには文字列型のCommentというプロパティがあります。そのため、デフォルトのモデルバインダーは狂ってしまいます。競合を避けるために2つのうちの1つの名前を変更してください。

たとえば以下はあなたの問題を解決します:

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

もちろん、あなたがそれについて考えるとき、ああ、完璧な意味があります。 c#は大文字と小文字が区別されるので、あなたは常にこの種の無神論者から安全だと思っていました。どうもありがとうございました。 – MrBliz

+0

このエラーで無駄な時間が浪費しました。あなたと感謝のために+1! – Matty

+0

血まみれの地獄!!!その偶然の大文字小文字を区別しない!!!最後に問題が修正されました – Rusty

0

私は同じエラーがあったが、原因は受け入れ答えは異なっていました。カスタムを追加すると、私のために修正されました。ModelBinder

ここ

How do you serialize a string as CDATA using XmlSerializer?説明するように、私は私がXMLに私のViewModelをシリアライズ

(それは素晴らしい解決策だから、それが最大投票してしまった場合を除き、それは最後の答えだ)CDataクラスを作成しました。 ViewModelのプロパティの型をCDataに設定すると、自動的にCDataセクションにシリアライズされ、CDataフィールドにデシリアライズされます。

自分のビューで投稿アクションを実行するときに、フォームの中にHtml.HiddenForとして追加されるように、私は自分のViewModelにいくつかのフィールドを残したいと思っています。

送信が完了すると、エラーが発生します(タイトルのもの)。モデルバインダーは、文字列フィールドを失敗した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()); 
1

私は、GETメソッド

[HttpGet] 
public ActionResult Create(int OSSB) 

にパラメータに同じ名前を持っていました..

[HttpGet] 
public ActionResult Create(int IDOSSB) 
関連する問題