2016-08-15 4 views
0

У меня есть выбор для пользователя, чтобы выбрать представление отчетности между двумя диапазонами дат.Передача динамической модели на частичный вид

Ниже мои ReportsViewModel.cs

public class ReportsViewModel 
{ 
    public DateTime DateRangeFrom { get; set; } 
    public DateTime DateRangeTo { get; set; } 
    public string ReportFor { get; set; } 
    public SelectList ReportForList { get; set; } 
} 

Теперь ReportForList будет иметь значения, как Любой, Table1, Table2, Таблица3.

Если пользователь выбирает Любойmodel, который собирается получить генерируется будет от всех 3-х таблиц и т.д., и, следовательно, структура модели будет на основе выбора пользователя. Как я буду генерировать model для этого и передать его в PartialView? Будет ли это набор из Key/Value пар или должен использоваться здесь dynamic? Нужно ли в любом случае достичь структуры отчетности по вышеуказанному требованию?

+0

Если модели разные, почему бы не разные частичные для каждой модели? –

+0

Как 4 разных частичных вида? @StephenMuecke –

+1

Да, и в методе контроллера - 'if (ReportFor =" Any ") {var model = ...; return PartialView ("_ AnyReport, model);) else if (ReportFor =" Table1 ") {var model = ...; return PartialView (" _ Table1Report ", model);) и т. д. (но предложите использовать перечисление для' ReportFor') –

ответ

1

Как правило, избегайте использования dynamic. Вы теряете проверку времени компиляции, intellisense и возможность использовать методы ***For() в своем представлении (лямбда-выражения не поддерживают динамические объекты).

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

public abstract class ReportBase 
{ 
    .... // common properties 
} 
public class Report1 : ReportBase 
{ 
    .... // properties specific table 1 
} 
public class Report2 : ReportBase 
{ 
    .... // properties specific table 2 
} 

, а затем создать сильные типизированных частичный вид для каждой модели, например _Report1.cshtml

@model Report1 // or IEnumerable<Report1> 

и в методе контроллера

public PartialViewResult ShowReport(ReportsViewModel model) 
{ 
    if (model.ReportFor == "Table1") 
    { 
     Report1 report = .... // your query to generate data 
     return PartialView("_Report1", report); 
    } 
    else if (model.ReportFor == "Table2") 
    { 
     Report2 report = .... // your query to generate data 
     return PartialView("_Report2", report); 
    } 
    else if (.... 
+0

Спасибо, Стивен .. Это имеет смысл .. :) –

Смежные вопросы