【问题标题】:访问控制器中的视图模型数据
【发布时间】:2022-01-23 10:22:17
【问题描述】:

在我的应用程序中,我创建了一个视图模型来在视图中显示数据。

我创建了这样的视图模型。

[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;
  }

}

在控制器中,我已将数据分配给视图模型并传递给视图。只是为了向用户显示数据,没有从用户视图中编辑或删除数据。该阶段工作正常。

这是风景

@model IEnumerable
<Asp_PASMVC.ViewModels.EmpExcelUploadViewModel>
@{
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>
      <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 Model)
            {
            <tr>
               <td>
                  @Html.DisplayFor(modelItem => item.CompanyId)
               </td>
               <td>
                  @Html.DisplayFor(modelItem => item.EmpNo)
               </td>
               <td>
                  @Html.DisplayFor(modelItem => item.EmpName)
               </td>
               <td>
                  @Html.DisplayFor(modelItem => item.EmpDep)
               </td>
               <td>
                  @Html.DisplayFor(modelItem => item.EmpDes)
               </td>
            </tr>
            }
            }
         </table>
      </div>
      <!-- /.card-body -->
   </div>
   }
</div>

我想知道,当用户点击上传按钮时,我想将视图模型中的数据传递给数据库。那么如何访问视图模型中已经存在的数据呢?我还在学习MVC,不知道有没有可能。

这是我尝试过的。在 empExcel 中出现 EmpExcelUploadViewModel 不包含公共实例的错误。

public ActionResult UploadEmployees(EmpExcelUploadViewModel empExcel) {
  try {

    foreach(var item in empExcel) // error in empExcel {
      int ComId = item.CompanyId;
      int EmpNo = item.EmpNo;
      string EmpName = item.EmpName;
      int DepId = item.EmpDep;
      int DesId = item.EmpDes;

      var isEmployeeExists = (from e in db.CreateEmployee where e.EmpNo == EmpNo select e.Id).First();

      if (isEmployeeExists != 0) {
        M_Employee e = new M_Employee();
        e.CompanyId = ComId;
        e.EmpNo = EmpNo;
        e.EmpName = EmpName;
        e.DepId = DepId;
        e.DesignId = DesId;
        e.Status = true;
        e.CreateDate = DateTime.Now;
        e.CreateBy = int.Parse(((System.Security.Claims.ClaimsIdentity) User.Identity).FindFirst("UserId").Value);
        db.CreateEmployee.Add(e);
        db.SaveChanges();
      } else {
        M_Employee m_Employee = db.CreateEmployee.First(x => x.Id == isEmployeeExists);
        m_Employee.DepId = DepId;
        m_Employee.DesignId = DesId;
        db.SaveChanges();
      }

    }
  } catch (Exception ex) {

    ViewBag.Error = "Error " + ex;
  }

  ViewBag.Error = "All Records uploaded to the database";
  ViewBag.EmpList = null;

  return View("Import");

}
}

【问题讨论】:

  • NotMapped 让我有点担心;为什么需要使用 EF 属性来告诉 EF 他们的视图模型不在数据库中?它通常是隐式的,因为视图模型不会在 EF 运行的上下文中使用

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


【解决方案1】:

您应该在控制器中保存数据,而不是在视图中保存数据。

在控制器中,如果将数据保存到数据库时出现任何错误,请设置一个单独的错误标志来指示这一点。然后,View 使用此标志来确定要显示的内容

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多