【问题标题】:How to map my model data (list) with another viewmodel data (list) MVC asp.net如何将我的模型数据(列表)与另一个视图模型数据(列表)映射 MVC asp.net
【发布时间】:2016-03-21 03:57:22
【问题描述】:

在这种情况下,如何将我的模型数据(列表)与另一个视图模型数据(列表)映射?

这是我所拥有的:

我的 json 视图模型

public class JsonViewModel
{
    public List<JsonItem> Items { get; set; } 
}

public class JsonItem
{
    public string Name { get; set; }
    public int Unit { get; set; }
    public decimal Price { get; set; }
    public IEnumerable<Item> ItemStock { get; set; } 
}

我的主要模型

public class Item
{
    public int ItemId { get; set; }
    public string Name { get; set; }
    public int QuantityInPack { get; set; }
    public int Quantity { get; set; }
    public decimal Price { get; set; }
    public bool IsHidden { get; set; }
}

应该以这种方式映射:

  • Item.QuantityInPack = JsonItem.Unit
  • Item.Price = JsonItem.Price

在哪里Item.Name = JsonItem.Name


控制器

public ActionResult Index()
{
    // 1. Perform HTTP request to retrieve the JSON.
    var webClient = new WebClient();
    string rawJson = webClient.DownloadString("http://my_json_data");

    // 2. Parse the JSON.
    var jsonRootObject = JsonConvert.DeserializeObject<JsonViewModel>(rawJson);

    // 3. Map to viewmodel
    var viewModel = new JsonViewModel
    {
        Items = jsonRootObject.Items.Select(i => new JsonItem
        {
            Name = i.Name,
                    Unit = i.Unit,
                    Price = i.Price
        }).ToList()
    };



    /// var TestItem = db.Items.ToList();
    /// TestItem.QuantityInPack = JsonItem.Unit
    /// TestItem.Price = JsonItem.Price
    ///     where Item.Name = JsonItem.Name
    ///
    /// (I know it's a bad, but I wanted to explain what I mean)
    /// Here i should map data in some way
    /// 
    ///

    // 4. Return mapped model to view
    return View( TestItem??? );
}

【问题讨论】:

  • 您是否尝试过寻找类似AutoMapper 的内容,它可以使用conventions 为您映射这些字段。如果这还不够,您可以提供您自己的自定义 resolvers
  • 另外我不想让你脱离正轨,但我建议你将视图模型构建逻辑移到 abstraction 上,这可以帮助你保持控制器的轻量级并且您只需要测试您的视图模型构建器是否正确behaviour

标签: asp.net json asp.net-mvc database viewmodel


【解决方案1】:

如果我理解正确,您想将JsonViewModel 与主模型同步并返回同步的主模型以查看:

public ActionResult Index()
{
    ...
    var itemList = db.Items.ToList();
    if (jsonRootObject.Items != null)
    {
        jsonRootObject.Items.ForEach(i =>
        {
            var item = itemList.FirstOrDefault(p => p.Name = i.Name);
            if (item != null)
            {
                item.QuantityInPack = i.Unit;
                item.Price = i.Price;
            }
        });
    }
    return View(itemList);
}

【讨论】:

  • 就是这样!请告诉我,如果我想对这个映射记录做点什么,我需要通过 db.SaveChanges(); 更新它(在返回 View(itemList); 之前)。但是我想这是非常糟糕的做法(因为 AJAX 每隔几秒就会调用一次此方法方法) - 那么我应该何时将此记录更新到数据库?
  • @Piter 您可以跟踪更改。如果某些 jsonModel 属性!= mainModel 属性,则保存到 db
【解决方案2】:

如果我不明白你想要什么,而 db 表示 dbContext,试试这个:

var names = viewModel.Items.Select(x => x.Name).ToList(); 
var TestItems = db.Items.Where(x => names.Contains(x.Name)).ToList();

var result = (from item in TestItems 
             join json in viewModel.Items on item.Name equals json.Name
             into subJsons from subJson in subJsons.DefaultIfEmpty() 
             select new { item, subJson }).ToList().
             Select(x => {
                  var newItem = x.item;
                  if(subJson != null)
                  {
                       newItem.QuantityInPack = x.subJson.Unit; 
                       newItem.Price = x.subJson.Price;
                  }
                  return newItem;
             }).ToList();

 return View(result);

【讨论】:

  • 此查询是左连接的实现,即如果测试项目中的一个项目没有来自 viewModel.Items 的配对,它仍然保留在结果中。否则,某些项目可能会从结果中排除:if(subJson != null) 正在检查对是否存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 2011-07-12
  • 2019-11-06
  • 2014-01-07
  • 2013-11-16
  • 1970-01-01
相关资源
最近更新 更多