【发布时间】:2017-11-08 20:24:37
【问题描述】:
我有一个表单,用户可以在其中输入日期并根据日期查看数据表。如果用户愿意,他可以将数据下载为 CSV 文件。 这是我的控制器:
public class SomeController : Controller
{
[HttpGet]
public ActionResult Index()
{
ModelClass model = new ModelClass();
return View(model);
}
[HttpPost]
public ActionResult Index(ModelClass data)
{
if (data != null)
{
data.ReadData();
return View(data);
}
else
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
}
[HttpPost]
public FileContentResult DownloadCSV(ModelClass data)
{
if (data != null)
{
// generate CSV
}
else
{
// ...
}
}
}
基本上,我的 GET-Index 会生成一个具有默认值的空模型(默认日期和数据 = null)。然后通过表单,用户更改日期并将模型提交给 POST-Index。在那里执行函数ReadData,它根据数据库请求在模型中生成数据并将其显示在视图中。如果模型中的数据不为空,则视图会显示一个带有另一个表单的表格,该表格链接到DownloadCSV。我希望与我的数据相同的模型将发布到DownloadCSV-site。但相反,我得到了一个空模型,它不为空,但没有数据。我怎样才能实现我想要的行为,为什么所描述的行为是预期的?
这是视图:
@using System.Data
@model Project.Models.ModelClass
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Title</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>SubTitle</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Date, htmlAttributes: new { @class = "control-label col-md-4" })
<div class="col-md-8">
<div class="input-group date">
@Html.EditorFor(model => model.Date, new { htmlAttributes = new { @class = "form-control form-date datecontrol", id = "datecontrol1" } })
<label class="input-group-addon btn" for="datecontrol1">
<i class="glyphicon glyphicon-calendar"></i>
</label>
</div>
@Html.ValidationMessageFor(model => model.Date, "", new { @class = "text-danger" })
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Submit" class="btn btn-default" />
</div>
</div>
</div>
}
@if (Model.Data != null)
{
<hr />
<div class="pre-scrollable">
<table class="table table-bordered table-responsive table-hover">
<tr>
<th style="white-space: nowrap; width: 1%;">Zeit</th>
@foreach (DataColumn col in Model.Data.Columns)
{
<th>@col.ColumnName</th>
}
</tr>
@foreach (DataRow row in Model.Data.Rows)
{
<tr>
@foreach (DataColumn field in Model.Data.Columns)
{
if (field.ColumnName != "Zeit")
{
<td>@(row[field.ColumnName] != DBNull.Value ? Convert.ToDouble(row[field.ColumnName]).ToString("F1") : "0")</td>
}
}
</tr>
}
</table>
</div>
using (Html.BeginForm("DownloadCSV", "Some"))
{
@Html.AntiForgeryToken()
<div class="form-group">
<div class="col-md-offset-9 col-md-12">
<input type="submit" value="Export CSV" class="btn btn-default" />
</div>
</div>
}
}
@*<div>
@Html.ActionLink("Back to List", "Index")
</div>*@
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
还有模特:
public class ModelClass
{
[Required]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
public DateTime Date { get; set; }
public DataTable Data { get; private set; }
public ModelClass()
{
Date = DateTime.Now;
}
public void ReadData()
{
Data = new DataTable();
// ... read data from database into datatable
}
}
如您所见,Data 只有在未执行 ReadData 时才应为 null。所以我在DownloadCSV 中得到的是一个刚刚创建的ModelClass 实例。
更新:
我可以解决 Data 字段从 POST-Index 到 DownloadCSV 的传输,而无需使用 TempData 在此问题之后再次请求数据:C# MVC pass data from one action method to another
【问题讨论】:
-
您的第二个表单不包含任何表单控件 - 只是一个提交按钮,因此在您提交时没有任何内容发送到服务器
-
而您在
Index()POST 方法中的if (data != null)毫无意义,因为它永远不会是null -
我应该在模型中放入一个隐藏字段来发布整个模型吗?
-
很抱歉,这很苛刻,但这里有很多不好的东西,很难相信你可以得到任何工作。您已经声明用户可以将数据下载为 CSV 文件 - 代码在哪里(您不能在 POST 方法中执行此操作)?您显示的数据似乎是由
Date属性过滤的 - 对吗?为什么要使用 POST 而不是 GET 来获取数据? -
我是 asp.net 的新手是正确的,所以这是一个用于许多其他对话框的模型,这些对话框将嵌入到不同的 Web 应用程序中。数据是根据从 SQL 请求到大型数据库的日期(以及我为简单起见省略的一些其他标准和表单字段)生成的。它根据日期显示给定工厂的能源消耗。我省略了生成 CSV 的代码,因为它工作正常,但如果有帮助,我可以用它更新我的帖子。我正在做一个 POST,因为我不希望服务器在
DownloadCSV中再次请求数据。
标签: c# asp.net-mvc