#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>
за aDictionary<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
а затем приведите ее к чему угодно