2011-11-02 72 views
27

我被這個難住了,你的幫助將是最適合的。從類型'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.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> 
+2

嘗試更改POST操作中的FeedbackComment參數名稱。另外,您應該在POST操作中設置CommentBy和CommentDate,而不是使用隱藏字段 – epzee

+0

非常感謝您的輔助提示。 – MrBliz

回答

62

的問題是你的行動參數的名稱:

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

當然,當你考慮它時,它是完全有意義的。一直以爲你會從這些惡意軟件中安全,因爲c#區分大小寫。非常感謝你。 – MrBliz

+0

這個錯誤浪費了大量的時間。爲你+1,謝謝! – Matty

+0

血腥地獄!它甚至不區分大小寫!最後問題得到修復 – Rusty

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()); 
1

我有同樣的名稱在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) 
相關問題