В настоящее время я работаю над проектом ASP.NET MVC 3, в котором мне нужно создать построитель отчетов.Модель отчета должна быть общей и просто «внедряться» для любого отчета.Отчет имеет определенные критерии, которые должны быть выполнены: это «Значения фильтра», которые находятся в форме списков выбора, и Включить дополнительную информацию (да-нет-опция), которая может быть любой дочерней сущностью, которая должна быть включенав отчете, и, наконец, макет отчета, который является перечислением.Вот код, который у меня есть для модели построителя отчетов:
public class ReportBuilderModel
{
public IList<FilterModel> FilterCriteria { get; set; }
public Dictionary<string, bool> AdditionalInformation { get; set; }
public ReportType ReportType { get; set; }
public String ReportName { get; set; }
public ReportBuilderModel()
{
}
public ReportBuilderModel(string reportName)
{
FilterCriteria = new List<FilterModel>();
AdditionalInformation = new Dictionary<string, bool>();
ReportName = reportName;
}
public void AddFilterCriteria(String fieldName, Object lookupObject)
{
FilterModel model = new FilterModel()
{
FieldName = fieldName,
LookupObject = lookupObject
};
FilterCriteria.Add(model);
}
public void AddAdditionalInformation(String fieldName, bool defaultValue)
{
AdditionalInformation.Add(fieldName, defaultValue);
}
}
public class FilterModel
{
public String FieldName { get; set; }
public Object LookupObject { get; set; }
}
public enum ReportType
{
Detail,
List,
Form,
Transaction
}
Представление, связанное с этим, выглядит следующим образом:
@model EduTOOL.Models.ReportBuilderModel
@{
ViewBag.Title = "Report Builder";
}
@Html.LoadPartial(EduTOOL.Controllers.PartialViewName._EditorForLibraries)
@using (Html.BeginForm())
{
<h2>
Build Report for @Model.ReportName</h2>
<div style="float: left; width: 35%; height: 20%;">
<fieldset>
<legend>Filter Criteria</legend>
<table>
@foreach (var filter in Model.FilterCriteria)
{
String displayText = "Select a " + filter.FieldName;
<tr>
<td>@Html.DisplayFor(label => displayText)
</td>
</tr>
<tr>
<td>@Html.EditorFor(editor => filter.LookupObject)
</td>
</tr>
}
</table>
</fieldset>
</div>
<div style="float: left; width: 35%; height: 20%;">
<fieldset>
<legend>Options</legend>
<table>
@foreach (var includeInfo in Model.AdditionalInformation)
{
String displayText = "Include " + includeInfo.Key + " information?";
<tr>
<td>@Html.DisplayFor(label => displayText)
</td>
</tr>
<tr>
<td>
@Html.EditorFor(includeValue => includeInfo.Value)
</td>
</tr>
}
</table>
</fieldset>
<br />
<br />
</div>
<div style="float: right; width: 30%; height: 20%;">
<fieldset>
<legend>Report Type</legend>
<br />
<table>
@foreach (var reportType in Enum.GetValues(Model.ReportType.GetType()))
{
<tr>
<td>
@Html.DisplayFor(displayText => reportType)
</td>
<td>
@Html.RadioButtonFor(radio => reportType, reportType.ToString())
</td>
</tr>
}
</table>
</fieldset>
<br />
<br />
</div>
<br />
<input class="button cyan" value="Generate Report" type="submit" />
}
Все они вызываются этими методами контроллера действий:
public ActionResult TestReport()
{
ReportBuilderModel model = new ReportBuilderModel("Distributor Contact List");
model.AddFilterCriteria("Distributor", DistributorController.GetDefaultAutoComplete());
model.AddFilterCriteria("Status", ActiveStatus.Active);
model.AddAdditionalInformation("Contact", true);
model.AddAdditionalInformation("History", true);
return View(model);
}
[HttpPost]
public ActionResult TestReport(ReportBuilderModel model)
{
return View();
}
Проблема не в том, что между HTTPGET и HTTPPOST для модели возникает связь, и я не знаю точно, как связать модели?Также я хотел бы знать, является ли это хорошим способом создания отчета Wizzard?Значения, выбранные в мастере построения отчетов, будут обрабатываться контроллером, который использует построитель.Идея заключается в том, чтобы получить список выбранных критериев для трех вариантов и создать отчет с использованием этих критериев.
Мне не разрешено использовать сторонние элементы управления.Любая помощь будет оценена.Большое вам спасибо!