web-dev-qa-db-de.com

Die Parameterkonvertierung vom Typ 'System.String' in Typ '' X 'ist fehlgeschlagen, da kein Typkonverter zwischen diesen Typen konvertieren kann

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>
28
MrBliz

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);
}
69
Darin Dimitrov

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)
1
Rafael Araújo

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());
0
Rubanov

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. 

0
Jamshaid Kamran