Динамическая модель MVC для просмотра

#c# #asp.net-mvc

#c# #asp.net-mvc

Вопрос:

элемент модели, переданный в словарь, имеет тип ‘System.Коллекции.Общий.Словарь 2[CapacityPlanner2.Models.Segment, CapacityPlanner2.Models.Product]', but this dictionary requires a model item of type 'System.Collections.Generic.Dictionary 2[System.Объект, система.Объект]

Мой взгляд имеет @model Dictionary<dynamic, dynamic>

и я передаю следующее Dictionary<Project, Segment>

Разве это не должно работать?

Мой частичный вид:

 @model Dictionary<dynamic, Dictionary<dynamic, List<dynamic>>>
  

Мой основной вид

 @model  Dictionary<dynamic, Dictionary<dynamic, Dictionary<dynamic, List<dynamic>>>>


@foreach (var kvp in Model) 
{   
    @Html.Partial("_part", kvp.Value)
}
  

Я хочу добавить частичное представление, потому что я хочу его повторно использовать. Но до этого все работает.

Комментарии:

1. Пожалуйста, можете ли вы добавить соответствующий HTML / jQuery и код вашей модели и контроллера?

2. Я много боролся с этим. Я не думаю, что текущая версия MVC позволяет это.

3. Это проблема ковариации. Вы не можете пройти Dictionary<Project, Segment> за a Dictionary<dynamic, dynamic> , поскольку они инвариантны. Когда вы определяете свой словарь, вы можете использовать Dictionary<dynamic, dynamic> и по-прежнему создавать его, состоящий из Project ключей и Segment значений, а затем передавать его в свое представление. Однако, каждый раз, когда вы чувствуете необходимость использовать dynamics, отступите назад и действительно подумайте, стоит ли вам это делать. Если действительно нет другого пути, то, возможно, вам придется, но это невероятно редко. Делайте все попытки постоянно вводить строгую типизацию.

Ответ №1:

Как упоминалось в комментарии, вы должны передать dynamic тип при создании модели. Вот рабочий пример. Но, как также упоминалось в комментарии, пожалуйста, проверьте, действительно ли вам нужно dynamic , может быть interfaced model , этого будет достаточно.

     public ActionResult Testing()
    {
        var data = new Dictionary<dynamic, Tuple<dynamic, dynamic>>
        {
            {1, new Tuple<dynamic, dynamic>(new Project{Name = "P1"}, new Segment{Id = "S1"})},
        };

        return View(data);
    }

    @foreach (var d in @Model)
          {
                  var item1 = @d.Value.Item1 as Project;
                  var item2 = @d.Value.Item2 as Segment;
                  <p> @d.Key   ": "    @item1.Name   " - "   @item2.Id</p>
          }
  

Ответ №2:

Кажется, что вы можете только объявить

 @Model dynamic
  

а затем приведите ее к чему угодно