Je suis perplexe avec celui-ci et votre aide serait la plus appréciée.
Je reçois l'erreur:
La conversion du paramètre de type 'System.String' en type 'DataPortal.Models.EntityClasses.FeedbackComment' a échoué car aucun convertisseur de type Ne peut convertir entre ces types.
Le ModelState.IsValid
échoue sur la propriété FeedbackComment.Comment
Des idées?
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; }
}
Méthodes de contrôleur
//
// 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);
}
Et la vue
@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>
Le problème est le nom de votre paramètre d'action:
public virtual ActionResult Create(FeedbackComment comment)
Cela s'appelle comment
. Mais votre FeedbackComment
a aussi une propriété appelée Comment
de type chaîne. Ainsi, le classeur de modèles par défaut devient fou. Il suffit de renommer l’un des deux pour éviter le conflit.
Par exemple, ce qui suit résoudra votre problème:
public virtual ActionResult Create(FeedbackComment model)
{
if (ModelState.IsValid)
{
_feedbackCommentRepository.Add(model);
return RedirectToAction(MVC.Feedback.Details(model.FeedbackId));
}
return View(model);
}
J'avais le même nom pour le paramètre de la méthode GET
[HttpGet]
public ActionResult Create(int OSSB)
.. et une propriété du modèle Faturamento, utilisée sur la méthode POST
[HttpPost]
public ActionResult Create(Faturamento model)
Juste comme ça..
public class Faturamento {
[Column("ID_OSSB")]
public virtual int ID_OSSB { get; set; }
[ForeignKey("ID_OSSB")]
public virtual OSSB OSSB { get; set; }
...
}
Ce qui a résolu pour moi a été de changer le nom du paramètre GET:
[HttpGet]
public ActionResult Create(int IDOSSB)
J'ai eu la même erreur mais la cause était différente de la réponse acceptée. L'ajout d'une personnalisation ModelBinder
l'a corrigé pour moi.
J'ai créé une classe CData
comme décrit ici
Comment sérialiser une chaîne en tant que CDATA en utilisant XmlSerializer? (c'est la dernière réponse à moins que cela ait été voté parce que c'est une excellente solution)
Je sérialise mon ViewModel en XML. Lorsque je définis un type dans une propriété de mon ViewModel sur CData
, il sera automatiquement sérialisé dans une section CData et désérialisé dans un champ CData
. (qui est genial!)
Lorsque je fais une action de publication dans ma vue, je souhaite conserver certains champs dans mon ViewModel afin qu'ils soient ajoutés en tant que Html.HiddenFor
dans le formulaire.
Lorsqu'une soumission est effectuée, une erreur se produit (celle du titre). Le classeur de modèle tente de lier un champ de chaîne à un champ CData qui échoue.
Un classeur de modèle personnalisé pour le type CData
résout ce problème.
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());
Dans mon cas, j’écrivais un nom de classe de modèle dans la classe Helper Helper. qui obtenait il a échoué car il attendait un type de données System.String
et je passais un nom de classe personnalisé.