【问题标题】:从 Controller 访问 ViewBag 数据
【发布时间】:2022-01-22 20:29:42
【问题描述】:

我还在学习MVC,不知道有没有可能,在我的应用程序中,我正在做一个excel上传任务。

所以这里上传了 Excel,我将添加到这些 Excel 数据以查看包并在视图中显示。


for (int i = 2; i <= range.Rows.Count; i++)
{
 try
   {
    M_Employee emp = new M_Employee();
    string comName = ((Microsoft.Office.Interop.Excel.Range)range.Cells[i, 1]).Text;
    var tempCompanyId = (from c in db.CreateCompany where c.CompanyName == comName select c.Id).First();
    emp.CompanyId = tempCompanyId;
    emp.EmpNo = int.Parse(((Microsoft.Office.Interop.Excel.Range)range.Cells[i, 2]).Text);
    emp.EmpName = ((Microsoft.Office.Interop.Excel.Range)range.Cells[i, 3]).Text;
    string dep = ((Microsoft.Office.Interop.Excel.Range)range.Cells[i, 4]).Text;
    var tempDepId = (from d in db.CreateDepartment where d.Department == dep select d.Id).First();
    emp.DepId = tempDepId;
    string dessig = ((Microsoft.Office.Interop.Excel.Range)range.Cells[i, 5]).Text;
    var tempDessId = (from h in db.CreateDesignation where h.Designation == dessig select h.Id).First();
    emp.DesignId = tempDessId;
    employees.Add(emp);
   }
   catch (Exception ex)
   {
     ViewBag.Error = "Error in " + i + " record";
     return View("Import");
   }
                       
}
if (employees !=null)
{
 ViewBag.EmpList = employees;
 return View("Import");
}


在视图中,显示用户导入的excel数据。

为了将这些数据上传到数据库表中,我创建了一个按钮,将上传操作结果映射到视图中

<input type="button" value="Upload" class="btn btn-success" onclick="location.href='@Url.Action("UploadEmployees", "M_Employee")'" />

在那个动作中,我尝试调用那些 ViewBag.EmpList 来获取相同的数据并传递给表格。

foreach (var item in ViewBag.EmpList)
{
  int ComId = item.CompanyId;
  int EmpNo = item.EmpNo;
  string EmpName = item.EmpName;
  int DepId = item.DepId;
  int DesId = item.DesignId;
}

但是我得到一个错误 viewbag value is null。那么有没有其他方法可以做到这一点?

谢谢

编辑--

这是我的看法

@{
ViewBag.Title = "Import";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div>
   @using (Html.BeginForm("Import", "M_Employee", FormMethod.Post, new { enctype = "multipart/form-data" }))
   {
   <div class="card card-primary">
      <div class="card-header">
         <h1 class="card-title"><b>Upload Employees from Excel</b></h1>
      </div>
      <!-- /.card-header -->
      <div>
         <br />
         @Html.Raw(ViewBag.Error)
         <h4><span>Select Excel File</span></h4>
         <input type="file" name="excelFile" class="btn btn-warning"  />
         <br />
      </div>
      <div class="row">
         <div class="col-md-1">
            <br />
            <br />
            <input type="submit" value="Import" class="btn btn-info" />
         </div>
         <div class="col-md-1">
            <br />
            <br />
            <input type="button" value="Upload" class="btn btn-success" onclick="location.href='@Url.Action("UploadEmployees", "M_Employee")'" />
         </div>
      </div>
      <div class="card-body p-0">
         <table class="table table-striped">
            <tr>
               <th>Company</th>
               <th>EmpId</th>
               <th>EmpName</th>
               <th>Department</th>
               <th>Dessignation</th>
            </tr>
            @if (ViewBag.EmpList != null)
            {
            foreach (var item in ViewBag.EmpList)
            {
            <tr>
               <td>
                  @item.CompanyId
               </td>
               <td>
                  @item.EmpNo
               </td>
               <td>
                  @item.EmpName
               </td>
               <td>
                  @item.DepId
               </td>
               <td>
                  @item.DesignId
               </td>
            </tr>
            }
            }
         </table>
      </div>
      <!-- /.card-body -->
   </div>
   }
</div>

这是我创建的视图模型。

[NotMapped]
public class EmpExcelUploadViewModel
{
public int CompanyId { get; set; }
public int EmpNo { get; set; }
public string EmpName { get; set; }
public int EmpDep { get; set; }
public int EmpDes { get; set; }
}

【问题讨论】:

  • 你也可以发布导入视图吗?

标签: c# asp.net asp.net-mvc


【解决方案1】:

您可以使用 ViewBag 或 ViewData 仅将数据从 Controller 单向传输到 View。

您应该使用表单将数据从客户端浏览器重新发送到您的后端。

或者,如果用户无法编辑数据,您可以使用以下任何一种:

  • 第一步保存文件,然后使用之前上传文件的标识符,重新读取保存
  • 第一步解析文件并将解析后的数据保存为draft,然后在第二步从数据中删除draft标记

【讨论】:

  • 你能不能展示你的观点 import pls
【解决方案2】:

您不能使用 ViewBag 将数据从客户端计算机移动到服务器。您可以使用 Session 或 TempData (如果数据很小) 将数据保存在服务器中,但我不建议使用它,因为它会影响应用程序的可扩展性。

你有两种方法

  1. 在您的上传操作中重复下载并将数据保存到数据库中

  2. 或者你必须修复动作,使用模型而不是 viewbag

....
if (employees !=null)
{
  return View("Import", employees);
}
else ... you error code

在导入视图中添加表单并通过提交按钮替换ancor

@model List<Employee>

@using (Html.BeginForm("UploadEmployees", "M_Employee", FormMethod.Post))
{
.... emloyee input controls

<button type="submit" value="Upload" class="btn btn-success">  </>

}

在 UploadEmployees 操作中,您可以从输入参数获取数据并保存到数据库。

【讨论】:

  • 嗨,你能帮我指导一下吗,我创建了一个视图模型,我想将员工列表传递给视图模型,我认为当用户单击提交按钮时会很容易,我可以从视图模型中获取数据并传递给数据表。
  • @YroxMk 您必须展示您的视图以及创建视图和提交视图的操作
  • 我已经更新了问题并添加了视图
猜你喜欢
  • 2019-05-19
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多