ASP MVC DropDownList ошибка "Преобразование в тип" - PullRequest
5 голосов
/ 24 декабря 2009

Эй, у меня есть таблица с 2 полями типа int, которые являются "StatusID" и "TypeID". TypeID работает правильно, но StatusID возвращает ошибку. Вот как выглядит мой контроллер:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Project project)
{

    var db = new DB();

    if (ModelState.IsValid)
    {

        try
        {
            db.Projects.InsertOnSubmit(project);
            db.SubmitChanges();

            return RedirectToAction("Index");
        }
        catch
        {
            return View(project);
        }
    }


    ViewData["Status"] = from c in db.Status
                         select new SelectListItem
                             {
                                 Text = c.Text,
                                 Value = c.StatusID.ToString()
                             };

    ViewData["Types"] = from t in db.Project_Types
                        select new SelectListItem
                            {
                                Text = t.Text,
                                Value = t.TypeID.ToString()
                            };
    return View(project);
}

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

Message = "Сбой преобразования параметра из типа 'System.String' в тип 'ConstructionProject.Models.Status', поскольку преобразователь TypeConverter между этими типами не может быть преобразован."

Но, как я уже сказал, модель базы данных для полей "TypeID" и "StatusID" идентична.

Edit:

Схема БД:

Таблица проекта

ProjectID   int
TypeID      int
StatusID    int
Name        varchar(50)
Description text
DateCreated datetime
ClientID    int
Contractor  int

Статус таблицы

StatusID    int
Text        varchar(50)

Таблица Тип проекта

TypeID      int
Text        varchar(50)

Кто-нибудь знает, что бы исправить проблему здесь?

Страница просмотра (после изменения StatusID):

        <p>
            <label for="Status">Status:</label>
            <%= Html.DropDownList("StatusID")%>
            <%= Html.ValidationMessage("StatusID", "*")%>
        </p>
        <p>
            <label for="Types">Type:</label>
            <%= Html.DropDownList("Types")%>
            <%= Html.ValidationMessage("Types", "*")%>
        </p>

Ответы [ 3 ]

5 голосов
/ 24 декабря 2009

Вот снимок в темноте: по вашему мнению, вы дали списку выбора статуса идентификатор «Статус», который, когда вы публикуете набор данных формы, заставляет преобразование коллекции форм по умолчанию пытаться преобразовать выбранное значение для списка (который является строковой версией вашего int StatusID) в ConstructionProject.Models.Status object , что не удается. Попробуйте использовать «StatusID» для идентификатора вашего списка выбора и посмотрите, работает ли он.

Чтобы получить лучшие ответы, вы также должны опубликовать соответствующие части вашей разметки.

1 голос
/ 06 февраля 2012

Если в вашем представлении несколько форм, убедитесь, что вы явно устанавливаете атрибут 'action' формы, используя правильную перегрузку метода BeginForm. То есть:

@using (Html.BeginForm("ACTION_METHOD", "CONTROLLER", FormMethod.Post, null))

Вместо этого:

@using (Html.BeginForm())
0 голосов
/ 16 мая 2011

Я думаю, что ваша ошибка может быть связана с тем, что где-то в вашем коде есть «Status» вместо «StatusId». Обратите внимание, что в сообщении об ошибке говорится о попытке преобразования в Status, а не StatusId.

Я столкнулся с этим на моем проекте. Если вы используете Entity Framework, и у вашего объекта есть внешний ключ, EF также собирается создать для вас ссылку на внешний объект (извините, если я не описываю это точно). Когда вы набираете «MyObject». в коде Intellisense предоставит вам как Status, так и StatusId.

В моем случае я использовал DropDownListFor () с model.PersonType вместо model.PersonTypeId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...