2008-12-16 3 views
8

यदि मैं एएसपीनेट एमवीसी में एक नियमित दृश्य प्रस्तुत कर रहा हूं जो मेरे पृष्ठ में दिखाए गए एकमात्र डोमेन ऑब्जेक्ट गुण हैं जिन्हें मैं विशेष रूप से लिखता हूं। उदाहरण के लिए:एएसपी.नेट एमवीसी अनुप्रयोग में जेसन आउटपुट के लिए डोमेन ऑब्जेक्ट्स को फ़िल्टर करने का सबसे अच्छा तरीका

<div><%= Customer.FirstName %></div> 

हालांकि, अगर मैं जेसन के लिए डोमेन ऑब्जेक्ट को क्रमबद्ध करता हूं तो इसमें प्रत्येक संपत्ति शामिल होगी। उदाहरण:

public JsonResult Customer (int? id) 
{ 
    Customer customer = _serviceLayer.GetCustomer (id.Value); 

    return Json (customer); 
} 

के बाद से मैं हर ग्राहक संपत्ति उजागर इस मामले में json के लिए उत्पादन गुण फिल्टर करने के लिए सबसे अच्छा तरीका है क्या नहीं करना चाहती? क्या आप UpdateModel() जैसी सूची/बहिष्कृत सूची का उपयोग कर सकते हैं? पब्लिक क्लास जेसन कस्टमर जैसे प्रॉक्सी क्लास का उपयोग करें? आप क्या सुझाव देंगे?

उत्तर

19

मैं इस के लिए अनाम प्रकार का उपयोग करें:

var customer = from c in serviceLayer.GetCustomers() 
       where c.Id == id.Value 
       select new { FirstName = c.FirstName }; 

यह सिर्फ एक अच्छा विचार नहीं है। इसके बजाय, यह अपवाद के खिलाफ सुरक्षा है जो आपको जेसन() को कॉल करते समय मिलेगा यदि आपके ऑब्जेक्ट ग्राफ़ में गोलाकार संदर्भ होता है।

1

आप अपनी कक्षा के गुणों को चिह्नित करने के लिए Newtonsoft लाइब्रेरी और [जेसन इग्नोर] विशेषता का उपयोग कर सकते हैं, जिसे आप बेनकाब नहीं करना चाहते हैं। अन्य पुस्तकालय हैं (संभवतः अलग-अलग संपत्ति विशेषता नाम को अनदेखा करते हैं), मैं व्यक्तिगत रूप से इसे पसंद करता हूं क्योंकि यह JSON कनवर्टर एक्सटेंशन आदि में बहुत लचीला है + यह आसानी से अज्ञात वस्तुओं को क्रमबद्ध कर सकता है।

public class Customer 
{ 
    ... 
    [JsonIgnore] 
    public string UrlIn { get; set; } 
    public string FirstName { get; set; } 
    // following example of a converter, you could write your own as well 
    [JsonConverter(typeof(Newtonsoft.Json.Converters.JavaScriptDateTimeConverter))] 
    public DateTime Created { get { return _created; } } 
} 
+0

मैंने इसके बारे में सोचा लेकिन व्यवस्थापक अनुभाग पर मैं गुणों का एक अलग सेट चाहता हूं। –

+0

मैं इस समस्या को हल करने के लिए सिर्फ एक नई तृतीय-पक्ष लाइब्रेरी शामिल नहीं करूंगा। – JacobE

+0

लिंक टूटा हुआ है? – BenB

4

कृपया एक दृश्य मॉडल का उपयोग करें। एक व्यू मॉडल एक ऑब्जेक्ट है जिसे यूआई स्क्रीन पर आपके डोमेन ऑब्जेक्ट्स का प्रतिनिधित्व करने के लिए उपयोग करता है। प्रत्येक स्क्रीन का अपना दृश्य मॉडल होता है।

जब आप अपना व्यू मॉडल बनाते हैं, जो एक डीटीओ है, जो डोमेन ऑब्जेक्ट्स का एक स्पष्ट, शून्य-सुरक्षित प्रक्षेपण है, उन गुणों को मैप न करें जिन्हें आप स्क्रीन पर प्रदर्शित नहीं करना चाहते हैं।

दृश्य मॉडल को क्रमबद्ध करें, न कि आपके डोमेन ऑब्जेक्ट।

+0

क्या आप एक उदाहरण को विस्तृत या लिंक कर सकते हैं? – Cherian

+0

यह एक अच्छा विचार है, सामान्य रूप से - और जब यह हुआ तब मैं क्या कर रहा था। मेरी समस्या एक ऐसे दृश्य मॉडल का उपयोग कर रही थी जिसमें संपत्तियां, जटिल वस्तुएं गुणों के रूप में थीं। धारावाहिक के माध्यम से देखा गया और कुछ माता-पिता-> बच्चे-> दृश्य मॉडल में गहरे संदर्भों को संदर्भित किया गया। मेरा टीआईपी - मॉडलों को फ्लैट, और जितना संभव हो सके सरल रखें! नियंत्रक में डेटा से दृश्य मॉडल में सरल प्रकार (स्ट्रिंग, दिनांक, int, आदि) लोड करें। – Jason

+0

मेरी राय पर, यह सही जवाब होना चाहिए। –

0

मैं एक ही समस्या में पड़ गए और समाधान में से एक

लिए उपयोग [ScriptIgnore] गुण .. यह समस्या का समाधान नहीं है।

System.Web.Script.Serialization का उपयोग करना:

ऐड system.web.extensions संदर्भ और नाम स्थान जोड़ें।

आप अभी भी कुछ विस्तृत विवरण on..for questions..Read है, तो ..

मैं के साथ एक उपयोगकर्ता वर्ग ..

प्रणाली का उपयोग करते हुए है,

सिस्टम का उपयोग कर। Coollections.Generic;

सिस्टम का उपयोग कर .Linq;

System.Web का उपयोग कर;

Iesi.Collections.Generic का उपयोग कर;

सिस्टम का उपयोग कर। रनटाइम।क्रमबद्धता;

नाम स्थान RAPortal.Core.Entities

{

सार्वजनिक वर्ग उपयोगकर्ता

{

private int _userId; 

    private string _firstName; 

    private string _lastName; 

निजी IList _applications;

private IList<Group> _groups; 

    private IList<ApplicationRequest> _applicationRequests; 

.... गुण ..

public virtual int UserId 

    { 

     get 

     { 

      return _userId; 

     } 

     set 

     { 

      _userId = value; 

     } 

    } 

    public virtual string Title 

    { 

     get 

     { 

      return _title; 

     } 

     set 

     { 

      _title = !String.IsNullOrEmpty(value) ? value.ToUpper().Trim() : null; 

     } 

    } 

सार्वजनिक आभासी IList समूह

{ 

     get 

     { 

      return _groups; 

     } 

     set 

     { 

      _groups = value; 

     } 

    } 

    public virtual IList<UserPrivilege> UserPrivileges 

    { 

     get 

     { 

      return _userPrivileges; 

     } 

     set 

     { 

      _userPrivileges = value; 

     } 

    } 

    public virtual IList<UserRole> UserRoles 

    { 

     get 

     { 

      return _userRoles; 

     } 

     set 

     { 

      _userRoles = value; 

     } 

    } 

... इतने पर ...

और मैं समूह वर्ग की है।

सिस्टम का उपयोग कर;

सिस्टम का उपयोग कर। Coollections.Generic;

सिस्टम का उपयोग कर .Linq;

System.Web का उपयोग कर;

System.Web.Script.Serialization का उपयोग कर;

सिस्टम का उपयोग कर .Runtime.Serialization;

नाम स्थान RAPortal.Core.Entities

{

सार्वजनिक वर्ग समूह

{

private int _groupId; 

    private string _name; 

    private IList<User> _users; 

    public virtual int GroupId 

    { 

     get 

     { 

      return _groupId; 

     } 

     set 

     { 

      _groupId = value; 

     } 

    } 

    public virtual string Name 

    { 

     get 

     { 

      return _name; 

     } 

     set 

     { 

      _name = !String.IsNullOrEmpty(value) ? value.ToUpper().Trim() : null; 

     } 

    } 

    [ScriptIgnore] 

    public virtual IList<User> Users 

    { 

     get 

     { 

      return _users; 

     } 

     set 

     { 

      _users = value; 

     } 

    } 

}

}

चूंकि उपयोगकर्ता को समूहों में संदर्भित किया जाता है .. जेसन सोचता है कि यह परिपत्र संदर्भ है और यह अपवाद फेंक देगा .. इसलिए उपयोगकर्ता के शीर्ष पर [ScriptIgnore] को ठीक करना है। और इस वर्ग में संदर्भ और नामस्थान जोड़ें ..

यह मेरी समस्या हल हो गया .. मुझे यकीन है कि वहाँ बेहतर तरीके हैं !!! चीयर्स ...

और तुम .. केवल समूहों कक्षा में और उपयोगकर्ता कक्षा में नहीं [scriptIgnore] जोड़ना चाहिए

+0

आपका उदाहरण स्पष्ट रूप से आपके बिंदु को स्पष्ट करने के लिए थोड़ा लंबा है। –

0

मेरे अनुभव में याद है, JavaScriptSerializer XmlSerialization के कुछ XmlIgnore के रूप में ऐसी विशेषताओं का भी सम्मान करता है।

संबंधित मुद्दे

 संबंधित मुद्दे