DropdownlistFor выдает ошибку

Я использую жестко закодированные строковые значения для выпадающего списка в представление и передаю выбранное значение из базы данных, где 0 = ожидание, 1 = завершено и 3 = ожидание, ниже приведен код для представления и контроллера:

 var paymentStatus = new[] { "Pending", "Complete", "AwaitingPayment" };
  ViewData["StatusID"] = new SelectList(paymentStatus, "Value", "Text", booking.StatusID);


   <tr><td>Status</td><td><%: Html.DropDownListFor(m => m.StatusID, ViewData["StatusID"] as SelectList)%></td></tr>

Возникает ошибка: DataBinding: «System.String» не содержит свойства с именем «Value».


person Mr A    schedule 15.07.2011    source источник


Ответы (3)


Проблема с вашим примером заключается в том, что вы передаете массив строк в SelectList, а затем указываете SelectList использовать свойства Value и Text (которых у строки нет). Вероятно, вам следует создать класс для этого:

public class Status {
    public int Id { get; set; }
    public string Text { get; set; }
}

var statusTypes = new List<Status> {
    new Status { Id = 1, Text = "Pending" },
    new Status { Id = 2, Text = "Complete" },
    new Status { Id = 3, Text = "AwaitingPayment" }
};

А еще лучше создайте репозиторий для этих данных:

var statusTypes = statusRepository.GetStatusTypes();

Передайте это в свой SelectList:

SelectList statusList = new SelectList(statusTypes, "Id", "Text", booking.StatusID);

// return this in a ViewModel or use ViewData like you are now:
ViewData["Status"] = statusList;

return View(statusList);
person Dismissile    schedule 15.07.2011

Пожалуйста, используйте модели просмотра:

var paymentStatuses = new[]
{
    new SelectListItem { Value = "0", Text = "Pending" },
    new SelectListItem { Value = "1", Text = "Complete" },
    new SelectListItem { Value = "3", Text = "AwaitingPayment" },
};
var model = new SomeViewModel
{
    StatusID = booking.StatusID,
    Statuses = new SelectList(paymentStatuses, "Value", "Text")
}
return View(model);

а потом:

<tr>
    <td>
        Status
    </td>
    <td>
        <%= Html.DropDownListFor(m => m.StatusID, Model.Statuses) %>
    </td>
</tr>

или если вы настаиваете на этом ViewData (я не рекомендую это, тем более, что у вас уже есть модель представления):

var paymentStatuses = new[]
{
    new SelectListItem { Value = "0", Text = "Pending" },
    new SelectListItem { Value = "1", Text = "Complete" },
    new SelectListItem { Value = "3", Text = "AwaitingPayment" },
};
ViewData["Statuses"] = new SelectList(paymentStatuses, "Value", "Text");
var model = new SomeViewModel
{
    StatusID = booking.StatusID
}
return View(model);

и в представлении:

<tr>
    <td>
        Status
    </td>
    <td>
        <%= Html.DropDownListFor(m => m.StatusID, ViewData["Statuses"] as SelectList) %>
    </td>
</tr>
person Darin Dimitrov    schedule 15.07.2011

Ошибка показывает, что невозможно Fine "Value", вам нужно сделать что-то вроде

new SelectList(paymentStatus, booking.Status, "Text", booking.StatusID)

bookin.Status будет любым текстовым свойством бронирования. надеюсь, что это поможет

person Saad    schedule 15.07.2011