2009-10-16 8 views
10

मैं एक उत्पाद प्रबंधन प्रणाली तैयार कर रहा हूं। मैं अपने आवेदन में प्रत्येक एक्शन/व्यू में बड़ी मात्रा में भिन्नता को संभालने का सबसे अच्छा तरीका सोच रहा हूं। ऐप 20 श्रेणियों और 12 लक्ष्य बाजारों को संभालता है, जिनमें से प्रत्येक डेटा को प्रभावित करता है जिसे प्रत्येक उत्पाद के लिए एकत्र करने की आवश्यकता होती है। उदाहरण के लिए, "क्विकएड" कार्रवाई मुख्य डेटा जैसे उत्पाद नाम और एसकेयू में ले जाती है, साथ ही श्रेणी और लक्ष्य बाजार के कॉम्बो के आधार पर जानकारी के कुछ अन्य महत्वपूर्ण टुकड़े जो उत्पाद को नीचे जोड़ा जा रहा है (नीचे उदाहरण)। श्रेणी और लक्ष्य बाजार उत्पाद के कॉन्फ़िगर करने योग्य गुण नहीं हैं, सिस्टम का उपयोग करने वाले उपयोगकर्ता केवल एक विशेष कॉम्बो के तहत काम कर सकते हैं, उदाहरण के लिए खिलौने/यूएसए। इसका उल्लेख करने का कारण यह है कि मैं प्रत्येक श्रेणी/बाजार कॉम्बो के लिए विशेषताओं के वर्गों के रूप में फॉर्म को डिज़ाइन नहीं कर सकता, इसे उस श्रेणी/बाजार के लिए फॉर्म की तरह काम करने की आवश्यकता है - उपयोगकर्ता को अन्य combos का कोई ज्ञान नहीं है।क्रियाओं और दृश्यों और मॉडल में उच्च स्तर की विविधता के लिए अनुमति

कुछ उदाहरण उम्मीद है कि संभव स्थितियों को स्पष्ट करने की:

मैं श्रेणी लक्ष्य बाजार संयुक्त राज्य अमेरिका के साथ खिलौने मैं की जरूरत है "आयु सीमा" के लिए पूछने के लिए और "पर कोई उत्पाद जोड़ने हूं, तो यह किया सुरक्षा निरीक्षण पास करें "।

यदि मैं श्रेणी मार्केट मैक्सिको के साथ खिलौने के लिए कोई उत्पाद जोड़ रहा हूं, तो बस को "आयु सीमा" के लिए पूछने की आवश्यकता है।

मैं लक्ष्य बाजार संयुक्त राज्य अमेरिका के साथ श्रेणी वस्त्र मैं "स्टाइल" के लिए पूछने की जरूरत है और "सामग्री" पर कोई उत्पाद जोड़ने हूं, तो

मैं श्रेणी कपड़े पर कोई उत्पाद जोड़ने हूं, तो क्या लक्ष्य बाजार कनाडा के साथ मैं "शैली" और "सामग्री" और "संयुक्त राज्य अमेरिका मूल्य"

हम 20 श्रेणियों और 12 लक्ष्य बाजार है, के लिए पूछने की आवश्यकता के साथ साथ वहाँ 10 रूपों है कि व्यवहार करने के लिए की जरूरत है हैं इस फैशन, तो 012 मेंसिद्धांत वहाँ 2400 अलग क्रिया/दृश्य/मॉडल

तो सवाल है, ASP.NET MVC में, क्या सबसे अच्छा तरीका है इन सभी गतिशील रूपों डेटा के रूपांतरों भेज दिया जाता है कि प्रदर्शित करने और हैंडलिंग को संभालने के लिए है कार्रवाई के लिए?

संपादित
कैसे उत्पाद की विशेषताओं निर्धारित कर रहे हैं संबंधी स्पष्टीकरण: वे उत्पाद एक बाजार में एक वर्ग से संबंधित के पदानुक्रम पर आधारित हैं। उदाहरण के लिए, यह उन सभी खिलौनों विशेषताओं और संयुक्त राज्य अमरीका विशेषताओं के अतिरिक्त नहीं है जिन्हें हम पूछेंगे, यह एक ऐसे उत्पाद का गुण है जो बाजार संयुक्त राज्य अमेरिका में बेची गई खिलौना है। संयुक्त राज्य अमेरिका में बेची गई खिलौना को "सुरक्षा निरीक्षण" जानकारी की आवश्यकता है, लेकिन संयुक्त राज्य अमेरिका में वस्त्र नहीं हैं। मेक्सिको में एक खिलौना को "सुरक्षा निरीक्षण" जानकारी की भी आवश्यकता नहीं है, ताकि विशेषता सभी खिलौनों या सभी यूएसए उत्पादों के लिए निहित न हो, बल्कि यह तथ्य कि श्रेणी और बाजार दोनों का एक कॉम्बो है।

+0

की एक बहुत मानक कार्यान्वयन का उपयोग सभी उत्पादों है कि एक श्रेणी में आते हैं उस वर्ग के गुणों के सभी ट्रैक करें समाप्त? क्या प्रत्येक लक्ष्य बाजार के गुणों के लिए भी यही कहा जा सकता है? –

+0

या, श्रेणियों और लक्ष्य बाजारों के बीच संबंध पदानुक्रमित है? श्रेणी -> लक्ष्य बाजार -> विशेषता सेट –

+0

क्या उत्पाद गुणों का सेट श्रेणी गुणों के सेट के बराबर है और लक्ष्य बाजार विशेषताओं का सेट है, जहां लक्ष्य बाजार श्रेणी पर निर्भर है? –

उत्तर

2

मैं विशेषता प्रकारों के लिए कुछ डोमेन मॉडल तैयार करूंगा।

public enum AttributeTypeEnum 
{ 
    Currency, 
    Range, 
    List, 
    Number, 
    Text, 
    Boolean 
} 

public interface class IAttribute 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
    AttributeTypeEnum AttType { get; set; } 
} 

public abstract class BaseAttribute 
{ 
    int Id { get;set;} 
    string Name { get;set;} 
    AttributeTypeEnum AttType { get; set; } 
} 

public class RangeAttribute<T> : BaseAttribute 
{ 
    T StartValue { get;set; } 
    T EndValue { get; set; } 
} 

तब करने के लिए एक या अधिक श्रेणियाँ

public class CategoryAttribute 
{ 
    int Id { get; set; } 
    IAttribute Attribute { get; set; } 
} 

प्रत्येक विशेषता सहयोगी फिर आप प्रत्येक श्रेणी के खिलाफ विशेषताओं की सूची हो सकता है

public class CategoryAttributeService() 
{ 
    public IList<CategoryAttributes> GetAttributes(int CategoryId) 
    { 
     return new IList<CategoryAttributes>(); 
    } 
} 

आपका नियंत्रक तो इन की एक सूची लौट सकते हैं ViewData.Model में विशेषताएं।

// controller action 
public class CategoryAttributeController : Controller 
{ 
    public ActionResult CategoryAttributes(int categoryId) 
    { 
     CategoryAttributeService cas = new CategoryAttributeServices(); 
     ViewData.Model = new CategoryAttributeViewData(categoryId) 
     { 
      Attributes = cas.GetAttributes(categoryId); 
     }; 
     return View(); 
    } 
} 

और आपके विचार प्रत्येक आइटम के प्रकार संभाल और प्रत्येक आइटम के हिसाब से यानी एक बूलियन एक चेकबॉक्स होगा (प्रारंभ और समाप्ति मूल्य के साथ एक सीमा) के रूप नियंत्रण/प्रदर्शन में परिवर्तन करते हैं, सामग्री हो सकती है एक लिस्टबॉक्स आदि आप कैसे प्रतिपादन संभाल करने पर विकल्पों की एक संख्या है, तो आपको एक अलग .ascx नियंत्रण प्रत्येक विशेषता प्रकार प्रपत्र नियंत्रण उत्पन्न करने के लिए के लिए नीचे के रूप में बनाने के बना सकते हैं, या एक एचटीएमएल सहायक विधि

<%@ Page Title="" Language="C#" Inherits="ViewPage<CategoryAttributeViewData>" %> 

<% foreach(CategoryAttribute attribute in ViewData.Model.Attributes) { %> 
<%= Html.RenderAttribute(attribute) %> 
<% } %> 

और सहायक उपकरण

public static string RenderAttribute(this HtmlHelper, ICategoryAttribute att) 
{ 
    StringWriter stringWriter = new StringWriter(); 
    using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter)) 
    { 
     switch(att.AttributeType) 
     { 
      case AttributeDataType.Boolean: 
       CreateCheckBox(writer, att); 
       break; 
      case AttributeDataType.List: 
       CreateListBox(writer, att); 
       break; 
      // Other types     
     } 
    } 
    stringWriter.ToString(); 
} 

संपादित करें: मैं ऊपर से बाहर छोड़े गए बाजारों को छोड़ देता हूं, इसलिए यदि मैं इसे सही ढंग से समझता हूं, तो प्रत्येक बाजार में कई श्रेणियां हैं (कई में से एक) यूएसए और वस्त्र कहें। श्रेणी वस्त्र कई बाजारों में दिखाई दे सकता है। प्रत्येक श्रेणी विशेषताओं का एक नंबर (कई लोगों के लिए एक) है (वस्त्र: रंग, आकार) और प्रत्येक विशेषता कई बाजार

  • बाजार की एक सूची हो सकता है (कई करने के लिए एक)
  • श्रेणियों
  • की सूची
  • MarketCategories की एक सूची
  • CategoryAttributes की एक सूची
  • विशेषताओं की सूची
  • AttributeMarkets की एक सूची

बाजार> MarketCategories> CategoryAttributes> गुण> AttributeMarkets

वह सही है?

मैक।

+1

मैं यह देखने के लिए उत्सुक हूं कि कार्रवाई के बाद डेटा को आप कैसे संभालेंगे। – JeremyWeir

+1

मुझे व्यू हैंडलिंग के संदर्भ में सामान्य दृष्टिकोण पसंद है। युगल अंक: क्या श्रेणी एट्रिब्यूट सेवा को लक्ष्य मार्केट आईडी नहीं लेना होगा? साथ ही मुझे लगता है कि एक्शन हस्ताक्षर 'सार्वजनिक एक्शन रिसैट क्विकएड (int श्रेणी आईडी, int targetMarketId, स्ट्रिंग उत्पाद नाम, स्ट्रिंग स्कू, आईनेमेरेबल विशेषताओं) की तरह दिखता है, जिसमें' गुण 'को मॉडल बाइंडर के साथ परिभाषित किया जाना चाहिए। दरअसल, पैरामीटर का एक गुच्छा मॉडल बाध्यकारी का उपयोग कर उत्पाद पैरामीटर में घुमाया जा सकता है। –

+0

आपको लक्ष्य मार्केट आईडी की आवश्यकता होगी, लेकिन श्रेणी आईडी नहीं, बस मॉडल बाइंडर में जोड़ें, यह भी मान लें कि विधि हस्ताक्षर को कम करने और इसे साफ रखने के लिए मॉडल बाध्यकारी का उपयोग करना समझ में आता है। –

0

प्रत्येक श्रेणी के मॉडल इकाई के लिए, एक मॉडल का मानना ​​है कि मौजूदा बाजार के अनुसार गुण फिल्टर बनाने के लिए,
संभवतः मक्खी
पर फ़िल्टर नहीं की गई संपत्तियों की एक शब्दकोश बनाने या दृश्य संकेत किसी और तरीके से जो गुण की अनदेखी करने/नहीं करने के लिए नज़रअंदाज़ करना।
- यदि प्रति संपत्ति फ़िल्टरिंग बहुत अधिक है, तो आप प्रति बाजार एक अलग मॉडल-व्यू (एक शब्दकोश का उपयोग करके) का उपयोग कर सकते हैं।

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

0

अपने डेटाबेस में एक मेज है कि कुछ इस तरह दिखता सेट करें:

Category nvarchar(*) 
Market nvarchar(*) 
AttributeName nvarchar(*) 
AttributeType nvarchar(*) 

तो स्पष्ट रूप से हर विशेषता संयोजन है कि आप उस तालिका में की जरूरत है (की दुकान होने की तरह, कुछ रिफैक्टरिंग, किया जा सकता है एक " विशेषताएं "तालिका जो त्वरित प्रविष्टि के लिए एक विशेषता की आवश्यकता होती है या नहीं, और श्रेणी/बाजार combos गुण साझा करने की अनुमति देगा)।

फिर अपने विचार में, उपयोगकर्ता की श्रेणी और बाजार कॉम्बो पढ़ सकते हैं और गतिशील रूप का निर्माण: में

फार्म के लिए अपने Page.Load में, प्रपत्र भागों आप की जरूरत का दृष्टांत, उन्हें सार्थक आईडी दे, तो अपने पोस्टबैक हैंडलर, Request.Form ऑब्जेक्ट से सभी डेटा पढ़ें।

एक छोटी उदाहरण:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Dim stuff As New System.Web.UI.WebControls.TextBox() 
    stuff.ID = "WOW64" 
    Page.Form.Controls.Add(stuff) 
End Sub 

Protected Sub Submit_Click(ByVal sender As Object, ByVal e As EventArgs) 
    Dim str As String = Request.Form("WOW64") 
    str = str ' do something with the string' 
End Sub 
संबंधित मुद्दे