1

я имел некоторый код, который в файле бритвой в таблице набора в DropDownList с помощью:Как сделать DropDownList MVC с помощью IDictionary, когда это не является частью таблицы

foreach (var item in group) { 
       <tr> 
        <td> 
    ... 
     @Html.DropDownListFor(modelItem => item.OfficeUserId, Model.OfficeApprovers, new { @class = "officeapproverddl", invoiceLineId = @item.InvoiceLineId, officeUserId = @item.OfficeUserId }) 
    ... 
    </td> 
    </tr> 
} 
    </table> 

Это хорошо работало, однако теперь я хочу, тот же раскрывающийся список за пределами таблицы. Следовательно, объект объекта не будет использоваться.

Как вы делаете эту работу за пределами таблицы, т.е. Все, что я должен предоставить сейчас, это Model.OfficeApprovers и html-атрибуты.

Model.OfficeApprovers имеет тип: new Dictionary<string, IEnumerable<SelectListItem>>();

ответ

1

Отсюда http://msdn.microsoft.com/en-us/library/ee703573.aspx мы имеем, что DropDownListFor имеет следующий синтаксис:

public static MvcHtmlString DropDownListFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression, 
    IEnumerable<SelectListItem> selectList, 
    Object htmlAttributes 
) 

Вы должны обеспечить выражение при построении DropDownListFor:

expression: System.Linq.Expressions.Expression(Of Func(Of TModel, TProperty)) 
An expression that identifies the object that contains the properties to render. 

Так что вы хотите это сделать, не будет работать с DropDownListFor.

Ваш лучший выбор в этом случае - использовать простой @Html.DropDownList. Вы можете использовать this overload добиться того, что вы хотите:

public static MvcHtmlString DropDownList(
    this HtmlHelper htmlHelper, 
    string name, 
    IEnumerable<SelectListItem> selectList, 
    IDictionary<string, Object> htmlAttributes 
) 

Пример:

@Html.DropDownList("officeApprovers", Model.OfficeApprovers, 
                new { @class = "officeapproverddl" } 

Edit:

Попробуйте это:

@Html.DropDownList("officeApprovers", Model.OfficeApprovers.Values[0], 
                new { @class = "officeapproverddl" } 
+0

На самом деле не работает, потому что мой selectList имеет тип Dictionary >() not IEnumerable AnonyMouse

+0

Сколько KeyValuePairs у вас есть в этом словаре? Почему вы используете словарь в этом случае? Кажется, что-то не так ... у вас должна быть веская причина. –

2

Есть ли причина, почему вы используя словарь?

Ниже приведен код, как я обычно делаю это при заполнении выпадающего списка. Это очень упрощенно, я предлагаю вам использовать его в качестве основы для создания вашего раскрывающегося списка.

В верхней части моего зрения мне указать вид модели:

@model MyProject.ViewModels.MyViewModel 

На мой взгляд, у меня есть выпадающий список, который отображает все банки, которые пользователь может выбрать из:

<table> 
    <tr> 
      <td><b>Bank:</b></td> 
      <td> 
       @Html.DropDownListFor(
        x => x.BankId, 
        new SelectList(Model.Banks, "Id", "Name", Model.BankId), 
        "-- Select --" 
       ) 
       @Html.ValidationMessageFor(x => x.BankId) 
      </td> 
    </tr> 
</table> 

У меня всегда есть модель представления для представления, я никогда не передаю объект домена непосредственно в представление. В этом случае на мой взгляд модель будет содержать список банков, которые будут заполнены из базы данных:

public class MyViewModel 
{ 
    // Other properties 

    public int BankId { get; set; } 
    public IEnumerable<Bank> Banks { get; set; } 
} 

Мой банк модель домена:

public class Bank 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Тогда в моем методе действий я создаю экземпляр моего просмотреть модель и заполнить список банков из базы данных.Как только это будет сделано, я верну модель представления к виду:

public ActionResult MyActionMethod() 
{ 
    MyViewModel viewModel = new ViewModel 
    { 
      // Database call to get all the banks 
      // GetAll returns a list of Bank objects 
      Banks = bankService.GetAll() 
    }; 

    return View(viewModel); 
} 

Надеюсь, это поможет.