我正在寻找一种在通过表单发布后保留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参数?
答案 0 :(得分:0)
您需要更新Html.BeginForm
和HttpPost
版本的报告方法。
@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
和其他报告类型的值。