Преобразование параметра из типа 'System.String' в тип '' X 'завершилось неудачно, потому что преобразователь типов не может преобразовать между этими типами - PullRequest
28 голосов
/ 02 ноября 2011

Я озадачен этим, и ваша помощь будет наиболее оценена.

Я получаю ошибку:

Преобразование параметра из типа '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>

Ответы [ 4 ]

74 голосов
/ 02 ноября 2011

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

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);
}
1 голос
/ 06 января 2017

У меня было то же имя для параметра в методе 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)
0 голосов
/ 17 октября 2018

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

0 голосов
/ 06 марта 2015

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

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

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

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

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