Ich bin verblüfft, und Ihre Hilfe wäre sehr dankbar.
Ich bekomme den Fehler:
Die Parameterkonvertierung vom Typ 'System.String' in den Typ 'DataPortal.Models.EntityClasses.FeedbackComment' ist fehlgeschlagen, da kein Typ vom Typ Zwischen diesen Typen konvertieren kann
ModelState.IsValid
schlägt in der FeedbackComment.Comment
-Eigenschaft fehl
Irgendwelche Ideen?
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; }
}
Controller-Methoden
//
// 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);
}
Und die Aussicht
@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>
Das Problem ist der Name Ihres Aktionsparameters:
public virtual ActionResult Create(FeedbackComment comment)
Es heißt comment
. Ihre FeedbackComment
hat aber auch eine Eigenschaft namens Comment
vom Typ string. So wird der Standard-Modellordner verrückt. Benennen Sie einfach eine der beiden um, um den Konflikt zu vermeiden.
Zum Beispiel wird das Problem durch Folgendes behoben:
public virtual ActionResult Create(FeedbackComment model)
{
if (ModelState.IsValid)
{
_feedbackCommentRepository.Add(model);
return RedirectToAction(MVC.Feedback.Details(model.FeedbackId));
}
return View(model);
}
Ich hatte den gleichen Namen für den Parameter in der GET-Methode
[HttpGet]
public ActionResult Create(int OSSB)
.. und eine Eigenschaft aus dem Faturamento-Modell, die für die Methode POST verwendet wurde
[HttpPost]
public ActionResult Create(Faturamento model)
Genau wie dieser..
public class Faturamento {
[Column("ID_OSSB")]
public virtual int ID_OSSB { get; set; }
[ForeignKey("ID_OSSB")]
public virtual OSSB OSSB { get; set; }
...
}
Was für mich gelöst wurde, war die Änderung des GET-Parameternamens:
[HttpGet]
public ActionResult Create(int IDOSSB)
Ich hatte den gleichen Fehler, aber die Ursache unterschied sich von der akzeptierten Antwort. Das Hinzufügen einer benutzerdefinierten ModelBinder
hat es für mich behoben.
Ich habe eine CData
-Klasse erstellt, wie hier beschrieben
Wie serialisiert man einen String als CDATA mit XmlSerializer? (es ist die letzte Antwort, es sei denn, es wurde gewählt, weil es eine großartige Lösung ist)
Ich serialisiere mein ViewModel in XML. Wenn ich in meinem ViewModel einen Typ auf CData
setze, wird er automatisch in einen CData-Abschnitt serialisiert und in ein CData
-Feld deserialisiert. (was großartig ist!)
Wenn ich in meiner Ansicht eine Post-Aktion durchführe, möchte ich einige Felder in meinem ViewModel beibehalten, damit sie im Formular als Html.HiddenFor
hinzugefügt werden.
Wenn ein Submit abgeschlossen ist, tritt ein Fehler auf (der im Titel). Der Modellbinder versucht, ein Zeichenfolgenfeld an ein fehlgeschlagenes CData-Feld zu binden.
Ein benutzerdefiniertes Modellbinder für den Typ CData
behebt dies
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());
In meinem Fall habe ich einen Modellklassennamen in der HTML-Helper-Klasse geschrieben. was fehlschlug, da es einen System.String
-Datentyp erwartete und ich einen benutzerdefinierten Klassennamen weitergab.