Преобразование параметров из типа "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>
Ответы
Ответ 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
и я передавал имя пользовательского класса.