Выпадающий список за выкидывает ошибку - PullRequest
0 голосов
/ 15 июля 2011

Я использую жестко закодированные строковые значения для раскрывающегося списка для представления и передаю выбранное значение из базы данных, где 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».

Ответы [ 3 ]

4 голосов
/ 15 июля 2011

Проблема с вашим примером заключается в том, что вы передаете строковый массив в 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 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);
3 голосов
/ 15 июля 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>
1 голос
/ 15 июля 2011

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

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

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

...