Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将ViewBag ViewModel返回给视图中BeginForm Post方法中的控制器_C#_Asp.net Mvc_Post_Viewmodel - Fatal编程技术网

C# 将ViewBag ViewModel返回给视图中BeginForm Post方法中的控制器

C# 将ViewBag ViewModel返回给视图中BeginForm Post方法中的控制器,c#,asp.net-mvc,post,viewmodel,C#,Asp.net Mvc,Post,Viewmodel,我有一个在页面上显示ViewModel的视图。我想让用户按下按钮创建一个CSV文件,然后通过电子邮件发送给他们。我有工作后,但被送回的ViewModel总是空的,即使页面清楚地显示了许多行 这是问题观点的一部分: <table style="width:99%" cellpadding="3" class="ContentTable" border="1" align="center"> @using (Html.BeginForm("SubmitExcel", "AllR

我有一个在页面上显示ViewModel的视图。我想让用户按下按钮创建一个CSV文件,然后通过电子邮件发送给他们。我有工作后,但被送回的ViewModel总是空的,即使页面清楚地显示了许多行

这是问题观点的一部分:

<table style="width:99%" cellpadding="3" class="ContentTable" border="1" align="center">

    @using (Html.BeginForm("SubmitExcel", "AllRecognition", new { AllRecognitions = ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel }, FormMethod.Post, new { id = "submitExcel" }))
    {
        <tr>
            <td style="padding:3px;">
                <input type="submit" name="BtnSubmitExcel" id="BtnSubmitExcel" value="Export to Excel" />
            </td>
        </tr>
    }

    <tr style="background-color:#5D7B9D;color:white;">
        <th style="width:4%;padding:3px;font-size:12px;">Date</th>
        <th style="width:8%;padding:3px;font-size:12px;">Employee</th>
        <th style="width:8%;padding:3px;font-size:12px;">Recognized By</th>
        <th style="width:6%;padding:3px;font-size:12px;">5-Star Standard</th>
        <th style="width:70%;padding:3px;font-size:12px;">Description</th>
        <th style="width:4%;padding:3px;font-size:12px;">Points</th>
    </tr>

    @{

        if (ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel != null)
        {
            foreach (Recognition.ViewModels.AllRecognitionViewModel item in ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel)
            {
                @:<tr>
                    @:<td style="width:4%;padding:3px;font-size:12px;">@item.Date</td>
                    @:<td style="width:8%;padding:3px;font-size:12px;">@item.Employee</td>
                    @:<td style="width:8%;padding:3px;font-size:12px;">@item.RecognizedBy</td>
                    @:<td style="width:6%;padding:3px;font-size:12px;">@item.FiveStarStandard</td>
                    @:<td style="width:70%;padding:3px;font-size:12px;">@item.Description</td>
                    @:<td style="width:4%;padding:3px;font-size:12px;">@item.Points</td>
                @:</tr>
                }



        }
    }

</table>

@使用(Html.BeginForm(“SubmitExcel”,“AllRecognitions”,new{AllRecognitions=ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel},FormMethod.Post,new{id=“SubmitExcel”}))
{
}
日期
雇员
认可
五星级标准
描述
要点
@{
如果(ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel!=null)
{
foreach(ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel中的Recognition.ViewModels.AllRecognitionViewModel项)
{
@:
@:@item.Date
@:@item.Employee
@:@item.RecognizedBy
@:@item.FiveStarStandard
@:@item.Description
@:@item.Points
@:
}
}
}
这是接收POST方法的控制器端:

public ActionResult SubmitExcel(List<ViewModels.AllRecognitionViewModel> AllRecognitions)
    {
        ViewBag.NoSearch = "block";
        ViewBag.SupervisorSearch = "none";
        ViewBag.DepartmentSearch = "none";
        ViewBag.EmployeeSearch = "none";

        DataTable dtAllRecognitions = Base.SQLHelper.ConvertListToDataTable(AllRecognitions.ToList());
        DataSet dsAllRecognitions = new DataSet();
        dsAllRecognitions.Tables.Add(dtAllRecognitions);
        FHSBase.FHS.DataHelper.SendMeExcelFile(dsAllRecognitions, "Recognitions", CurrentUser);

        ViewModels.AllRecognitionBigViewModel AllRecognitionBigViewModel = new ViewModels.AllRecognitionBigViewModel();
        AllRecognitionBigViewModel.AllRecognitionViewModel = null;
        Models.DateRange DateRange = new Models.DateRange();
        DateRange.fromDate = DateTime.Today.Date;
        DateRange.toDate = DateTime.Today.Date;
        AllRecognitionBigViewModel.DateRange = DateRange;
        ViewBag.AllRecognitionBigViewModel = AllRecognitionBigViewModel; 

        List<SelectListItem> empList = new List<SelectListItem>();
        string VPath = "Index";
        return View(VPath, empList);

    }
public ActionResult SubmitExcel(列出所有识别)
{
ViewBag.NoSearch=“块”;
ViewBag.SupervisorSearch=“无”;
ViewBag.DepartmentSearch=“无”;
ViewBag.EmployeeSearch=“无”;
DataTable dtAllRecognitions=Base.SQLHelper.ConvertListToDataTable(AllRecognitions.ToList());
数据集dsAllRecognitions=新数据集();
dsAllRecognitions.Tables.Add(dtAllRecognitions);
FHSBase.FHS.DataHelper.SendMeExcelFile(dsAllRecognitions,“Recognitions”,CurrentUser);
ViewModels.AllRecognitionBigViewModel AllRecognitionBigViewModel=新的ViewModels.AllRecognitionBigViewModel();
AllRecognitionBigViewModel.AllRecognitionViewModel=null;
Models.DateRange DateRange=新的Models.DateRange();
DateRange.fromDate=DateTime.Today.Date;
DateRange.toDate=DateTime.Today.Date;
AllRecognitionBigViewModel.DateRange=DateRange;
ViewBag.AllRecognitionBigViewModel=AllRecognitionBigViewModel;
List empList=新列表();
字符串VPath=“Index”;
返回视图(VPath、empList);
}

“AllRecognitions”视图模型在ActionResult中为空,但在视图本身中不为空。如何使用视图中显示的当前值将当前视图模型返回到ActionResult(SubmitExcel)?

您的表单为空。因此,没有数据被发布到服务器

提交表单时,它不会将整个页面发送到服务器。(服务器如何知道如何处理HTML以从中获取所需的值?)它从表单元素发送键/值对。您只有一个表单元素:

<input type="submit" name="BtnSubmitExcel" id="BtnSubmitExcel" value="Export to Excel" />
你会想要这个:

for (var i = 0; i < ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel.Count(); i++)
或许:

@Html.HiddenFor(x => x.AllRecognitionViewModel[i].Date)
我实际上是在猜测,因为我更习惯于使用模型而不是ViewBag。(您可能希望尝试使用它,这可能会使事情变得更简单。)您可能需要进行一些调试,以确定服务器端代码中到底发生了什么

最终,您希望在客户端代码中看到的元素与此类似:

<input type="hidden" name="AllRecognitionViewModel.Date[0]" value="..." />

需要注意的关键是
name
属性。通过将这些键/值对的“数组”发送到服务器,model binder应该能够构建
列表

您的表单是空的。因此,没有数据被发布到服务器

提交表单时,它不会将整个页面发送到服务器。(服务器如何知道如何处理HTML以从中获取所需的值?)它从表单元素发送键/值对。您只有一个表单元素:

<input type="submit" name="BtnSubmitExcel" id="BtnSubmitExcel" value="Export to Excel" />
你会想要这个:

for (var i = 0; i < ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel.Count(); i++)
或许:

@Html.HiddenFor(x => x.AllRecognitionViewModel[i].Date)
我实际上是在猜测,因为我更习惯于使用模型而不是ViewBag。(您可能希望尝试使用它,这可能会使事情变得更简单。)您可能需要进行一些调试,以确定服务器端代码中到底发生了什么

最终,您希望在客户端代码中看到的元素与此类似:

<input type="hidden" name="AllRecognitionViewModel.Date[0]" value="..." />

需要注意的关键是
name
属性。通过将这些键/值对的“数组”发送到服务器,model binder应该能够构建
列表

这对您有用吗?这是一种不同的方法。既然您不在视图中操作任何内容,只想导出到Excel,为什么不将结果放在TempData而不是ViewBag中,然后在发布时检索它呢?TempData在那一次返回的记忆中很好

因此,在初始控制器渲染中,执行以下操作:

TempData["AllRecognition"] = ThisIsMyAllRecognitionViewModelData;
然后,当他们提交到excel时,该数据仍处于临时状态

public ActionResult SubmitExcel()
    {
var MyDataMadeIt = TempData["AllRecognition"];
// do some stuff
}

这对你有用吗?这是一种不同的方法。既然您不在视图中操作任何内容,只想导出到Excel,为什么不将结果放在TempData而不是ViewBag中,然后在发布时检索它呢?TempData在那一次返回的记忆中很好

因此,在初始控制器渲染中,执行以下操作:

TempData["AllRecognition"] = ThisIsMyAllRecognitionViewModelData;
然后,当他们提交到excel时,该数据仍处于临时状态

public ActionResult SubmitExcel()
    {
var MyDataMadeIt = TempData["AllRecognition"];
// do some stuff
}

我确实决定将BeginForm帖子环绕整个表,但控制器中仍然有一个空的viewmodel。我尝试了您显示的两种hiddenfor方法,但我收到一条错误消息,关于不能与IEnumerable列表一起使用,IEnumerable列表是视图中进一步使用的另一个模型。我觉得奇怪的是,我无法将ViewBag Viewmodel传递回控制器。@普迪瓜纳曼:您可以将数据传递回控制器。你