C# ASP.NET MVC将当前模型发布到另一个索引

C# ASP.NET MVC将当前模型发布到另一个索引,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个表单,用户可以输入日期并根据日期查看数据表。如果用户愿意,可以将数据下载为CSV文件。 这是我的控制器: public class SomeController : Controller { [HttpGet] public ActionResult Index() { ModelClass model = new ModelClass(); return View(model); } [H

我有一个表单,用户可以输入日期并根据日期查看数据表。如果用户愿意,可以将数据下载为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索引生成一个带有默认值(默认日期和数据=null)的空模型。然后,用户通过表单更改日期并将模型提交到POST索引。执行函数
ReadData
,从数据库请求生成模型内的数据,并在视图中显示。如果模型中的数据不为空,视图将显示一个带有另一个表单的表,该表单链接到
下载csv
。我希望与我的数据相同的模型将发布到
下载csv
-站点。但是我得到了一个空模型,它不是空的,但是没有数据。我怎样才能实现我想要的行为?为什么所描述的行为是预期的

以下是视图:

@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")
}
如您所见,
Data
只有在未执行
ReadData
时才应为null。因此,我在
downloadcv
中得到的是刚刚创建的
ModelClass
实例

更新:
我可以解决将
数据
字段从POST-
索引
传输到
下载CSV
的问题,而无需使用
TempData
再次请求数据,如下问题:

感谢Stephen Mueckes的评论和这个问题 我可以用以下方法解决这个问题:

更新控制器: 更新视图:
使用(Html.BeginForm(“downloadcv”,“Some”))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model=>model.Date)
}

这样,我将结果存储在
TempData
中,并且在导出CSV时不必再次请求它们
TempData
将仅为以下请求存储。

感谢Stephen Mueckes的评论和这个问题 我可以用以下方法解决这个问题:

更新控制器: 更新视图:
使用(Html.BeginForm(“downloadcv”,“Some”))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model=>model.Date)
}

这样,我将结果存储在
TempData
中,并且在导出CSV时不必再次请求它们
TempData
将仅为以下请求存储。

您的第二个表单不包含任何表单控件-仅包含一个提交按钮,因此在提交时不会向服务器发送任何内容,并且
索引()中的
if(data!=null)
POST方法毫无意义,因为它永远不会为
null
我是否应该将模型放入一个隐藏字段来发布整个模型?很抱歉,这里有很多不好的东西,很难相信你能得到任何有用的东西。您已经声明用户可以将数据作为CSV文件下载-代码在哪里(您不能在POST方法中完成)?您显示的数据似乎已通过
Date
属性进行过滤-是否正确?为什么你要发帖子而不是获取数据呢?我是asp.net新手,这是正确的,所以这是一个其他许多对话框的模型,这些对话框将嵌入到不同的web应用程序中。数据是根据从一个SQL请求到一个大型数据库的日期(以及我为简单起见省略的一些其他标准和表单字段)生成的。它根据日期显示给定工厂的能耗。我省略了生成CSV的代码,因为它工作得很好,但是如果有帮助的话,我可以用它更新我的帖子。我发帖子是因为我不希望服务器在
downloadcv
中再次请求数据。您的第二个表单不包含任何表单控件-只有一个提交按钮,因此在您提交它时没有向服务器发送任何内容,并且
索引()中的
if(data!=null)
POST方法毫无意义,因为它永远不会为
null
我是否应该将模型放入一个隐藏字段来发布整个模型?很抱歉,这里有很多不好的东西,很难相信你能得到任何有用的东西。您已经声明用户可以将数据作为CSV文件下载-代码在哪里(您不能在POST方法中完成)?您显示的数据似乎已通过
Date
属性进行过滤-是否正确?为什么你要发帖子而不是获取数据呢?我是asp.net新手,这是正确的,所以这是一个其他许多对话框的模型,这些对话框将嵌入到不同的web应用程序中。数据是根据从一个SQL请求到一个大型数据库的日期(以及我为简单起见省略的一些其他标准和表单字段)生成的。它根据日期显示给定工厂的能耗。我省略了生成CSV的代码,因为它工作得很好,但是如果有帮助的话,我可以用它更新我的帖子。我之所以发帖子,是因为我不希望服务器在
downloadcv
中再次请求数据。
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
    }
}
public class SomeController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {            
        ModelClass model = new ModelClass();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(ModelClass model)
    {
        model.ReadData();
        TempData['data'] = model.Data

        return View(data);
    }

    [HttpPost]
    public FileContentResult DownloadCSV(ModelClass model)
    {
        // model only has the date populated from the form, so take the data from TempData
        model.Data = TempData['data']

        // ... generate CSV     
    }
}
using (Html.BeginForm("DownloadCSV", "Some"))
{
    @Html.AntiForgeryToken()

    <div class="form-group">
        <div class="col-md-offset-9 col-md-12">
            @Html.HiddenFor(model => model.Date)
            <input type="submit" value="Export CSV" class="btn btn-default" />
        </div>
    </div>
}