0

我正在寻找一种在通过表单发布后保留 url 参数的方法。例如,我的 GET 方法采用字符串“type”并使用它来确定要在视图中呈现的报告类型。网址如下所示:

http://mysite/Reports/Report?type=1

    [HttpGet]
    public ActionResult Report(string type)
      {
         var model = new ReportsModel()
          {  
             Report = ReportList.Find(o => o.ReportType == type)
          };

          return View(model);             
       }

视图有一个表单,该表单具有开始/结束日期过滤器,用于确定要为报告类型显示的日期的日期范围:

@using (Html.BeginForm("Report", "Reports"))
   {
        Report.ReportName
        @Html.HiddenFor(o => o.Report.ReportType)
        @Html.EditorFor(o => o.Report.StartDate )<br/>
        @Html.EditorFor(o => o.Report.EndDate )<br/>
        <button id="reports">Report</button>
   }

上面的表单发布到一个操作,该操作根据指定的报告类型、开始/结束日期从数据库中获取报告数据,然后返回到视图。

[HttpPost]
        public ActionResult Report(GenericReportsModel model)
        {
            switch (model.Report.ReportType)
            {
                case ReportType.ReportType1:
                    model.Result = ReportRepository.GetReport<ReportType1>(model.StartDate, model.EndDate);
                    break;
                case ReportType.ReportType2:
                    model.Result = ReportRepository.GetReport<ReportType2>(model.StartDate, model.EndDate);
                    break;                    
            }    
            return View(model);
        }        

问题是在发布之后,“类型”参数从 url 中丢失了。

Before the post: http://mysite/Reports/Report?type=1 
After the post: http://mysite/Reports/Report

我需要能够做这样的事情(这不起作用):

 return View(model, new {ReportType = model.ReportType);

如果有人想复制并粘贴 url 发送给其他人,我如何在帖子后保留 url 中的类型参数?

4

1 回答 1

0

您需要更新Html.BeginFormHttpPost的 Report 方法版本。

@using(Html.BeginForm("Report", "Report", "YourController", new { type = model.ReportType})
{
    // I am assuming that model.ReportType == type argument 
    // in your HttpGet Report action

    // The rest of the form goes here
}

您的操作应如下所示:

[HttpPost]
public ActionResult Report(string type, GenericReportsModel model)
{
    switch (model.Report.ReportType)
    {
        case ReportType.ReportType1:
            model.Result = ReportRepository.GetReport<ReportType1>(model.StartDate, model.EndDate);
            break;
        case ReportType.ReportType2:
            model.Result = ReportRepository.GetReport<ReportType2>(model.StartDate, model.EndDate);
            break;                    
    }    
    return View(model);
}   

如果type不等于 model.ReportType,那么您应该创建一个 ViewModel,其中包含您GenericsReportModel和其他 Report 类型中的值。

于 2013-04-27T19:48:53.767 回答