2015-12-15 30 views
5

Model verilerim (liste) bu durumda başka bir viewmodel verisi (liste) ile nasıl eşlenir? İşte Model verilerimi (liste) başka bir viewmodel verisiyle eşleme (liste) MVC asp.net

i ne var:

    :

    Benim json ViewModel

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

    Benim asıl Modeli bu şekilde aktarılması gerektiğini

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

    İstediğin ve db DBContext ne anlama geldiğini anlamamıza Eğer

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

nerede Item.Name = JsonItem.Name


Kontrolör

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???); 
} 
+0

sen (http [AutoMapper] gibi benzer bir şey arayın denediniz. org /) bu kuralları [sözleşmeler] kullanarak haritalandırabilir (https://github.com/AutoMapper/AutoMapper/wiki/Conventions). Bu yeterli değilse, kendi özel [resolvers] 'ınızı sağlayabilirsiniz (https://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers). – kayess

+0

Ayrıca sizi raylardan uzaklaştırmak istemiyorum, ama viewmodel yapı mantığını [soyutlama] 'ya taşıyorsunuz (http://benfoster.io/blog/using-the-view). -kolay-desen-in-aspnet-mvc), kontrol cihazınızı hafif tutmanıza yardımcı olabilir ve sadece viewmodel oluşturucunuzu doğru bir şekilde test etmeniz gerekir [davranış] (http://googletesting.blogspot.hu/2013/08/ Test-on-tuvalet-test davranış not.html). – kayess

cevap

2

, ana modelle JsonViewModel senkronize etmek ve görünümüne senkronize ana modeli dönmek istiyorum: // automapper:

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); 
} 
+0

Bu kadar! Lütfen bana, bu eşlenmiş kayıtla bir şeyler yapmak istediğimi söylersem, bunu ** db.SaveChanges(); ** (View (itemList);) 'den önce güncellemeliyim. Ancak, sanırım gerçekten kötü bir uygulamadır (bu yöntem, AJAX tarafından her birkaç saniyede bir başlatılır) - bu yüzden bu kaydı ne zaman veritabanına güncellemeliyim? – DiPix

+1

@Piter değişiklikleri takip edebilirsiniz. Bazı jsonModel özelliği! = mainModel özelliği sonra db'ye kaydedin –

+0

İyi nokta, teşekkür ederim. – DiPix

0

, şunu deneyin:

i sağ anlasalardı
+0

SubJson nedir? – DiPix

+0

Bu sorgu, sol birleştirmenin bir uygulamasıdır, örn. Test Öğelerindeki öğelerden birinin viewModel'den bir çifti yoksa, bunun sonucu yine de kalır. Bu olmadan bazı öğeler sonuçtan çıkarılabilir: 'if (subJson! = Null)' mevcut çifti kontrol ediyor. –