Подтвердить что ты не робот

Преобразование параметров из типа "System.String" в тип "X" не получилось, потому что конвертер типа не может преобразовывать между этими типами

Я в тупике с этим, и ваша помощь будет наиболее восприимчивой.

Я получаю сообщение об ошибке:

Преобразование параметров из типа 'System.String' для типа "DataPortal.Models.EntityClasses.FeedbackComment" потерпел неудачу, потому что нет тип конвертер может конвертировать между этими типами

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>
4b9b3361

Ответ 1

Проблема заключается в имени вашего параметра действия:

public virtual ActionResult Create(FeedbackComment comment)

Он называется comment. Но ваш FeedbackComment также имеет свойство comment типа string. Таким образом, связующее устройство по умолчанию становится сумасшедшим. Просто переименуйте один из двух, чтобы избежать конфликта.

Например, следующее исправление проблемы:

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

Ответ 2

У меня было то же имя для параметра метода 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)

Ответ 3

У меня была такая же ошибка, но причина была отличной от принятого ответа. Добавление пользовательского ModelBinder исправлено для меня.

Я создал класс CData, как описано здесь

Как вы сериализуете строку как CDATA с помощью XmlSerializer? (это последний ответ, если только он не получил голосование, потому что это отличное решение)

Я сериализую свой ViewModel для XML. Когда я устанавливаю тип в свойстве ViewModel в CData, он будет автоматически сериализован в раздел CData и десериализован в поле CData. (что здорово!)

Когда я делаю post action в своем представлении, я хочу сохранить некоторые поля в моей модели 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());

Ответ 4

В моем случае я писал имя класса модели в классе Html Helper. который получал его сбой, поскольку он ожидал тип данных System.String и я передавал имя пользовательского класса.