2011-03-30 9 views
7

मैं वर्तमान में मेरे MVC परियोजना के HomeController में निम्नलिखित कोड है:MVC - एक दृश्य पर अनेक डेटा तालिकाओं पासिंग

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     MyDataContext dc = new MyDataContext(); 

     IQueryable<Table1Data> j = 
      from n in dc.Table1      
      select n; 

     return View(j); 
    } 

ताकि ठीक से काम करता है, लेकिन अब मैं करने के लिए के माध्यम से एक दूसरी तालिका पास करना चाहते हैं एक ही दृश्य तो मैं सोच रहा था मैं इस तरह कुछ करने के लिए सक्षम होना चाहिए:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     MyDataContext dc = new MyDataContext(); 

     IQueryable<Table1Data> j = 
      from n in dc.Table1      
      select n; 

     IQueryable<Table2Data> l = 
      from k in dc.Table2   
      select k; 

     return View(j, l); 
    } 

वहाँ दृश्य वैकल्पिक रूप से इस तरह के दो मॉडल को स्वीकार करने या, दो परिणाम सेट (दो तालिकाओं को मर्ज करने के लिए एक रास्ता है करने के लिए एक रास्ता है किसी भी तरह से जुड़े हुए नहीं हैं

उत्तर

16

हां वहाँ है, लेकिन ऐसा नहीं है। एक कस्टम व्यू मॉडेल क्लास बनाने के लिए आप जो करना चाहते हैं वह करने का तरीका है। इस वर्ग (MyPageViewModel) में आपके प्रत्येक ऑब्जेक्ट के लिए दो (या अधिक) गुण होंगे। आपके विचार में, आप Model.Table1Data और Model.Table2Data का उपयोग करके उन्हें एक्सेस करेंगे।

public class MyPageViewModel 
{ 
    public IQueryable<Table1Data> Table1Data { get; set; } 
    public IQueryable<Table2Data> Table2Data { get; set; } 
} 

आप दृश्य दृढ़ता से करने की आवश्यकता होगी इस कस्टम ViewModel वर्ग के लिए टाइप किया:

एक कस्टम ViewModel वर्गबहुत सरल है।

<%@ Page Title="MyPage" MasterPageFile="~/Application/Master Pages/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage(Of MyAppNamespace.MyPageViewModel)" %> 

स्वयं को टाइप करने की कोशिश न करें; नया दृश्य बनाना आसान है और "दृढ़ता से टाइप किया गया" दृश्य देखें, और अपनी नई कस्टम व्यूमोडेल क्लास निर्दिष्ट करें।

फिर अपने कार्रवाई नियंत्रक विधि होगा:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
    MyDataContext dc = new MyDataContext(); 

    MyPageViewModel vm = new MyPageViewModel(); 

    vm.Table1Data = from n in dc.Table1      
        select n; 

    vm.Table1Data = from k in dc.Table2   
        select k; 

    return View(vm); 
    } 
} 
3

हाँ - कि दोनों तालिकाओं शामिल हैं - जो आप अपने मॉडल के रूप में इस्तेमाल करेगा - एक नया वर्ग बनाने के लिए:?, अपने नियंत्रक में

public class MyModel { 
    public IQueryable<Table1Data> Table1Data { get; set; } 
    public IQueryable<Table2Data> Table2Data { get; set; } 
} 

फिर, इस वर्ग को प्रारंभ और दोनों को पॉप्युलेट गुण और इसे अपने दृश्य में भेजें। फिर, इस ne को पहचानने के लिए दृश्य को संशोधित करें दृश्य मॉडल के रूप में डब्ल्यू टाइप करें।

0

पूर्व MVC3 में मैं प्रत्येक के लिए एक ViewModel का इस्तेमाल किया और जोड़ने है | गुण आप दृश्य का उपयोग करना चाहते आपत्ति है। यदि आप एमवीसी 3 का उपयोग कर रहे हैं तो मैं ViewBag पर एक नज़र डालेगा।

एक साधारण दृश्य मॉडल:

public class SomeViewModel 
{ 
    public object Object1 { get; set; } 
    public string Message { get; set; } 
} 

फिर अपने नियंत्रक में आप इस आपके विचार करने के लिए दे देते हैं:

var vm = new SomeViewModel { Object1 = coolThing, Message = neatMessage }; 
return View(vm); 
2

क्यों आप इस के लिए अपने मॉडल में एक वर्ग को जोड़ने नहीं है?

public class MyModel { 

public j {get; set;} 
public l {get; set;} 

} 

फिर आप व्यू के हेड पर दृश्य में MyModel को पास करते हैं।

नियंत्रक पर:

public ActionResult इंडेक्स() { MyDataContext डीसी = नए MyDataContext();

IQueryable<Table1Data> j = 
     from n in dc.Table1      
     select n; 

    IQueryable<Table2Data> l = 
     from k in dc.Table2   
     select k; 

    MyModel myclass = new MyModel(); 
    myclass.j = j; 
    myclass.l = l; 

    return View(myclass); 
} 
1

आप उन दोनों को एक भी ViewModel में कर सकता है:

मॉडल परिभाषा:

public class YourModelName 
{ 
     public IQueryable<Table1Data> FirstTableData { get; set;} 
     public IQueryable<Table2Data> SecondTableData { get; set;} 

     public YourModelName(IQueryable<Table1Data> d1, IQueryable<Table2Data> d2) 
     { 
      this.FirstTableData = d1; 
      this.SecondTableData = d2; 
     } 
} 

उपयोग (नियंत्रक में):

public ActionResult Index() 
    { 
     MyDataContext dc = new MyDataContext(); 

     IQueryable<Table1Data> j = 
      from n in dc.Table1      
      select n; 

     IQueryable<Table2Data> l = 
      from k in dc.Table2   
      select k; 

     YourModelName model = new YourModelName(j, l); 

     return View(model); 
    } 
0

आप होगा शायद है का उपयोग करने के लिए ViewModel। आप कक्षा को परिभाषित करते हैं, जिसमें आपके इच्छित वर्गों (+ कोई अन्य अतिरिक्त गुण) के उदाहरण होंगे, और फिर आप इसे मॉडल के रूप में उपयोग करेंगे।

class NewViewModel { 
    Table1 T1 {get;set;} 
    Table2 T2 {get;set;} 
    int Anything {get;set;} 
} 

तो फिर तुम बस इन ViewModel वर्गों और उनमें से बाद में पहुँच उदाहरणों में से संग्रह तैयार की तरह:

NewViewModel m = new NewViewModel(); 
var a = m.T1.PropertyA; 
var b = m.T2.PropertyB; 

आदि .. बस एक वर्ग में सभी संस्थाओं की जरूरत विलय और अपने मॉडल के रूप में इस वर्ग का उपयोग नियंत्रक और दृश्य में।

2

मैंने 'टेबल' की सूची बनाकर और मेरे दृश्य मॉडल में इसे पास करके समस्या हल की। यह अनिवार्य रूप से TransactionEntities की एक सूची की एक सूची है। एफवाईआई, मेरे समाधान का नाम डीएएल रखा गया था, और मॉडलों में मैंने लेनदेन का प्रतिनिधित्व करने के लिए एक लेनदेन एंटीटी बनाई थी।

private TransactionEntity te; 
    private IEnumerable<TransactionEntity> tel1; // A list of TransactionEntities 
    private IEnumerable<TransactionEntity> tel2; 
    private IEnumerable<TransactionEntity> tel3; 
    private IEnumerable<IEnumerable<TransactionEntity>> telCollection; 

मैं अपने ते 'पंक्तियों' के साथ लेन-देन इकाई सूची (tel1, tel2, tel3) पॉप्युलेट, तो मेरे telCollection को (अनिवार्य रूप से एक मेज की तरह) तीन 'टेलीफोन' वस्तुओं को जोड़ने और मेरे ViewData को यह आवंटित ।आदर्श।

telCollection = new List<IEnumerable<TransactionEntity>>(); 
    telCollection = telCollection.Concat(new[] { tel1 }); 
    telCollection = telCollection.Concat(new[] { tel2 }); 
    telCollection = telCollection.Concat(new[] { tel3 }); 
    ViewData.Model = telCollection; 
    return View(); 

ASPX फ़ाइल में, मैं तो सूची प्राप्त और प्रत्येक 'तालिका' (ElementAt (#)) के माध्यम से पुनरावृति, तीन अलग-अलग कॉलम, ताल 'टेबल' से प्रत्येक के लिए एक का निर्माण। बीटीडब्ल्यू, आप काउंटर वैरिएबल को अनदेखा कर सकते हैं।

<td> 
    <% int counter = 0; %> 
    <% IEnumerable<IEnumerable<DAL.Models.TransactionEntity>> tranlist = 
      (IEnumerable<IEnumerable<DAL.Models.TransactionEntity>>)ViewData.Model; %> 

    <% foreach (DAL.Models.TransactionEntity te in tranlist.ElementAt(0)) 
     {.... create rows/columns as needed for the data in a HTML sub-table ......} %> 
</td> 
<td> 
    <% counter = 0; %> 
    <% foreach (DAL.Models.TransactionEntity te in tranlist.ElementAt(1)) 
     {..........} %> 
</td> 
<td> 
    <% counter = 0; %> 
    <% foreach (DAL.Models.TransactionEntity te in tranlist.ElementAt(2)) 
     {..........} %> 
</td> 
संबंधित मुद्दे