MVC如何传递URL值以及从动作到视图的模型

时间:2013-04-27 19:45:15

标签: forms c#-4.0 asp.net-mvc-4 view controller

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

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);
        }        

问题是在帖子之后,“type”参数会从网址中丢失。

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

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

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

如果有人想复制并粘贴网址发送给其他人,我怎样才能在帖子后保留网址中的type参数?

1 个答案:

答案 0 :(得分:0)

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

@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和其他报告类型的值。