【问题标题】:How to use viewmodel (IEnumerable) to update my database in ASP.NET MVC 4如何使用 viewmodel (IEnumerable) 在 ASP.NET MVC 4 中更新我的数据库
【发布时间】:2014-11-05 14:31:20
【问题描述】:

{WV_DeviceReg, WV_DevEventLog, WV_DevSystemLog, WV_DeviceConfig} 是我来自 ADO.NET Entity Framework 的模型。

视图模型

namespace MvcWebVms.Models
{
    public class HomeViewModels
    {
        public IEnumerable<WV_DeviceReg> DeviceReg { get; set; }
        public IEnumerable<WV_DevEventLog> DevEventLog { get; set; }
        public IEnumerable<WV_DevSystemLog> DevSystemLog { get; set; }
        public IEnumerable<WV_DeviceConfig> DeviceConfig { get; set; }
    }
}

查看

@model MvcWebVms.Models.HomeViewModels

@using (Html.BeginForm()){

    <div>

       @foreach (var item in Model.DeviceConfig) {

             @Html.HiddenFor(modelItem => item.FieldName)
             @Html.HiddenFor(modelItem => item.DeviceID_F)

            <div class="editor-label">
                    @Html.DisplayFor(modelItem => item.FieldName)
            </div>
            <div class="editor-field">
                    @Html.EditorFor(modelItem => item.FieldValue)
            </div>

        } 
        <input type="submit" value="Apply" />

    </div>
}

控制器

public ActionResult Setting(string id)
{
    HomeServices service = new HomeServices();
    return View(service.GetDeviceSettingAT(id));
}

public WVDBEntities wvdb = new WVDBEntities();

[HttpPost]
public ActionResult Setting(HomeViewModels viewModels)
{

    if (ModelState.IsValid)
    {

    foreach (????????????)
        {
           ????????????????
        }
        wvdb.SaveChanges();
        return View(viewModels);
    }
    else
    {
        return View();
    }

}

表格

WV_DeviceConfig { FieldName(PK), DeviceID_F(PK), FieldValue, ServerTime }

FieldName的Key映射FieldValue的值

问:请问如何使用foreach更新我的数据库?

【问题讨论】:

  • 我很想回答“斯蒂芬·穆克知道答案”
  • 由于viewModels 的所有属性在您回帖时都是空的,所以让我们先解决这个问题。您需要为每种类型使用EditorTemplate 或使用for 循环来呈现您的控件(并将集合从IEnumerable 更改为IList)。 This answer 解释了这个问题。 (大声笑@AbdulAhmad)

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


【解决方案1】:

我认为首先你想将你的 foreach 循环更改为传统的 for 循环并像这样发回一个 List:

@for (int i = 0; i < Model.DeviceConfig.Count(); i ++) {
       @Html.HiddenFor(m => m.DeviceConfig[i].FieldName)
 //etc.. same thing for all hidden/input fields

并且您的操作方法可以接受这样的列表

[HttpPost]
public ActionResult Setting(List<DeviceConfig> DeviceConfigList)

然后您可以执行以下操作来更新数据库

foreach (var item in DeviceConfigList)
    {
      db.Entry(item).State = EntityState.Modified;
    }
db.SaveChanges();

【讨论】:

  • 假设 OP 想要回发整个模型,所以方法参数应该是 HomeViewModels model 然后是 foreach (var item in model.DeviceConfigList) {...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2013-05-31
  • 2013-12-17
相关资源
最近更新 更多