2016-08-15 102 views
0

我有一個選項供用戶選擇2日期範圍之間的報告視圖。將動態模型傳遞給局部視圖

下面是我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將有值一樣任何表1表2表3

如果用戶選擇任何即將生成的model將來自所有3個表格,因此模型的結構將基於用戶選擇。我將如何產生model爲此並將其傳遞到PartialView?它會是一組Key/Value對還是應該dynamic在這裏使用?無論如何要達到上述要求的報告結構?

+0

如果模型不同,爲什麼不爲每個模型不同的部分? –

+0

像4種不同的部分視圖? @StephenMuecke –

+1

是的,並在控制器方法 - 「if(ReportFor =」Any「){var model = ...;返回PartialView(「_ AnyReport,model);)else if(ReportFor =」Table1「){var model = ...; return PartialView(」_ Table1Report「,model);)etc'(但建議您使用enum作爲' ReportFor' values) –

回答

1

一般情況下,請避免使用dynamic。您會失去編譯時檢查,智能感知以及在視圖中使用***For()方法的能力(lambda表達式不支持動態對象)。

改爲使用強類型併爲每個報表創建視圖模型。假定會有一些通用的屬性,然後用鹼模型

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

謝謝斯蒂芬..這很有道理.. :) –

相關問題