Проблема с привязкой пользовательской модели построителя отчетов к неизменному количеству критериев фильтра - PullRequest
0 голосов
/ 12 марта 2012

В настоящее время я работаю над проектом 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?Значения, выбранные в мастере построения отчетов, будут обрабатываться контроллером, который использует построитель.Идея заключается в том, чтобы получить список выбранных критериев для трех вариантов и создать отчет с использованием этих критериев.

Мне не разрешено использовать сторонние элементы управления.Любая помощь будет оценена.Большое вам спасибо!

1 Ответ

1 голос
/ 12 марта 2012

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

Вот хорошая статья о привязке модели. Я бы предложил сначала связать что-то простое, например, текстовое поле. Перемещение вверх по списку и списку объектов внутри другого объекта. Модель Binding

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...