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



我有一个在页面上显示ViewModel的视图。我想允许用户按下一个按钮来创建一个CSV文件,然后通过电子邮件发送给他们。我让POSt工作,但发送回来的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>

这是控制器侧接收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);
    }

ActionResult中的"AllRecognitions"视图模型为空,但视图本身不为空。如何将当前视图模型返回到ActionResult(SubmitException),并在视图中显示当前值?

这对你有用吗?这是一种不同的方法。既然你没有在视图中操作任何东西,只想导出到Excel,为什么不把结果放在TempData而不是ViewBag中,然后在POST中检索呢?TempData在那次返程的记忆中很好。

因此,在您的初始控制器渲染中,执行:

TempData["AllRecognition"] = ThisIsMyAllRecognitionViewModelData;

然后,当他们提交到excel时,该数据仍在Temp.中

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

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

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

<input type="submit" name="BtnSubmitExcel" id="BtnSubmitExcel" value="Export to Excel" />

因此,只有一个键/值被发送到服务器。

您需要做的第一件事是将表单包装在要发布到服务器的数据周围。所以基本上是围绕着你的整张桌子。

接下来,您将需要发出实际的表单元素。页面上的文本不是可用的数据,它只是页面内容。由于模型是一个List<ViewModels.AllRecognitionViewModel>,那么您应该能够通过对循环进行简单的修改来完成它。因此,取而代之的是:

foreach (Recognition.ViewModels.AllRecognitionViewModel item in ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel)

你会想要这个:

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

表单元素可以是hidden,因此您不会更改页面中的当前用户体验也许类似这样的东西:

@Html.HiddenFor(x => x[i].Date)

或者:

@Html.HiddenFor(x => x.AllRecognitionViewModel[i].Date)

实际上,我在这里有点猜测,因为我更习惯于使用模型而不是ViewBag。(你可能想尝试使用它,它可能会让事情变得更简单。)你可能需要进行一些调试,以确定服务器端代码中到底发生了什么。

最终,您希望在客户端代码中看到的是类似于以下的元素:

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

因此,如果以上@Html.EditorFor建议不起作用,您可以手动执行。在循环中,它可能看起来像这样:

<input type="hidden" name="AllRecognitionViewModel.Date[@i]" value="@ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel[i].Date" />

需要注意的关键是name属性。通过将这些键/值对的"数组"发送到服务器,模型绑定器应该能够构造List<ViewModels.AllRecognitionViewModel>

相关内容

  • 没有找到相关文章

最新更新