2012-02-18 13 views
7

मैंने अभी व्यूमोडल्स का उपयोग करना शुरू कर दिया है। क्या आप लोग यह कोड देखने के लिए देख सकते हैं कि मैं सबसे अच्छा अभ्यास कर रहा हूं या नहीं? क्या साधारण से कुछ भी है? क्या आप सत्यापन को अलग-अलग करेंगे?एएसपी.नेट एमवीसी में व्यूमोडेल कार्यान्वयन - क्या यह कोड सबसे अच्छा अभ्यास है?

क्षमा करें यदि कोड लंबा है (इसमें बहुत सारे हिस्से हैं)। मैंने इसे यथासंभव समझने में आसान बनाने की कोशिश की है।

धन्यवाद!

मॉडल

public class CustomerModel 
    { 
    [Required(ErrorMessage="Primer nombre!")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage="Segundo nombre!")] 
    public string LastName { get; set; } 

    [Required(ErrorMessage="Edad")] 
    public int? Age { get; set; } 

    public string State { get; set; } 
    public string CountryID { get; set; } 

    [Required(ErrorMessage="Phone Number")] 
    public string PhoneNumber { get; set; } 
    } 

ViewModel

public class CustomerViewModel 
    { 
    public CustomerModel Customer { get; set; } 

    public string Phone1a { get; set; } 
    public string Phone1b { get; set; } 
    public string Phone1c { get; set; } 
    } 

नियंत्रक

public ActionResult Index() 
    { 
     CustomerViewModel Customer = new CustomerViewModel() 
     { 
     Customer = new CustomerModel(), 
     }; 


     return View(Customer); 
    } 


    [HttpPost] 
    public ActionResult Index(CustomerViewModel c) 
    { 

     //ModelState.Add("Customer.PhoneNumber", ModelState["Phone1a"]); 

     // Let's manually bind the phone number fields to the PhoneNumber properties in 
     // Customer object. 
     c.Customer.PhoneNumber = c.Phone1a + c.Phone1b + c.Phone1c; 

     // Let's check that it's not empty and that it's a valid phone number (logic not listed here) 
     if (!String.IsNullOrEmpty(c.Customer.PhoneNumber)) 
     { 
     // Let's remove the fact that there was an error! 
     ModelState["Customer.PhoneNumber"].Errors.Clear(); 
     } // Else keep the error there. 

     if (ModelState.IsValid) 
     { 
     Response.Write("<H1 style'background-color:white;color:black'>VALIDATED</H1>"); 
     } 
     return View("Index", c); 
    } 

    } 

वी iew

@model MVVM1.Models.CustomerViewModel 

@using (Html.BeginForm("Index", "Detail")) 
{ 
    <table border="1" cellpadding="1" cellspacing="1"> 
    <tr> 
     <td>@Html.LabelFor(m => m.Customer.FirstName)</td> 
     <td> 
     @Html.TextBoxFor(m => m.Customer.FirstName) 
     @Html.ValidationMessageFor(m => m.Customer.FirstName) 
     </td> 
    </tr> 
    <tr> 
     <td>@Html.LabelFor(m => m.Customer.LastName)</td> 
     <td> 
     @Html.TextBoxFor(m => m.Customer.LastName) 
     @Html.ValidationMessageFor(m => m.Customer.LastName) 
     </td> 
    </tr> 
    <tr> 
     <td>@Html.LabelFor(m => m.Customer.Age)</td> 
     <td> 
     @Html.TextBoxFor(m => m.Customer.Age) 
     @Html.ValidationMessageFor(m => m.Customer.Age) 
     </td> 
    </tr> 

    <tr> 
     <td>@Html.LabelFor(m => m.Customer.PhoneNumber)</td> 
     <td width="350"> 
     @Html.TextBoxFor(m => m.Phone1a, new { size="4", maxlength="3" }) 
     @Html.TextBoxFor(m => m.Phone1b) 
     @Html.TextBoxFor(m => m.Phone1c) 
     <div> 
     @Html.ValidationMessageFor(m => m.Customer.PhoneNumber) 
     </div> 
     </td> 
    </tr> 
    <tr> 
     <td></td> 
     <td> 
     <input type="submit" value="Submit" /></td> 
    </tr> 
    </table> 
} 

उत्तर

2

एक बात है कि मुझ पर बाहर कूदता है यह है:: उदाहरण के लिए, आप RegularExpressionAttribute कक्षा का उपयोग करना चाहें

if (ModelState.IsValid) 
    { 
    Response.Write("<H1 style'background-color:white;color:black'>VALIDATED</H1>"); 
    } 
    return View("Index", c); 

याद रखें कि दृश्य मॉडल अपने नियंत्रक और वापस करने के लिए डेटा पारित करने के लिए अच्छे हैं आपके मॉडल के लिए। मैं अनुशंसा करता हूं कि आप अपने दृश्य मॉडल में एक IsValid प्रॉपर्टी जोड़ें और फिर Response.Write को कॉल करने के बजाय इसे सही पर सेट करें। इसके बाद अपने आंशिक दृश्य के शीर्ष से जोड़ें:

@if (Model.IsValid) 
{ 
    <H1 style'background-color:white;color:black'>VALIDATED</H1> 
} 

आप भी अपने ध्यान में रखते हुए ModelState करने के लिए मिल सकता है, लेकिन कुछ लोगों का तर्क है कि एक सबसे अच्छा अभ्यास नहीं है। हालांकि, अगर आप कुछ करने के लिए अपने मॉडल में कोई प्रॉपर्टी जोड़ते नहीं करना चाहते तो आप बस अपने दृश्य में देख सकते हैं तो आप सिर्फ यह कर सकते हैं:

@if (ViewData.ModelState.IsValid) 

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

public class CustomerViewModel      
{      
    public CustomerModel Customer { get; set; } 

    [Required(ErrorMessage="Primer nombre!")]       
    public string FirstName 
    { 
     get { return Customer.FirstName; } 
     set { Customer.FirstName = value; } 
    } 
... 

यह निरर्थक लग सकता है और हमेशा लायक प्रयास नहीं है लेकिन यह एंटिटी फ्रेमवर्क डोमेन मॉडल या अन्य कक्षाओं का उपयोग करते समय विचार करना एक अच्छा अभ्यास है जो संशोधित करना मुश्किल या असंभव है।

+0

वास्तव में अच्छे अंक। IsValid संपत्ति बनाने के बारे में अच्छा विचार। – SaltProgrammer

1

मैं कहूंगा कि अपने ViewModel कार्यान्वयन सुंदर मानक है। आप व्यूमोडेल का उपयोग अपने व्यू और आपके डोमेन मॉडल के बीच मध्यवर्ती ऑब्जेक्ट के रूप में कार्य करने के लिए कर रहे हैं। कौन सा अच्छा अभ्यास है।

एकमात्र चीज जो मैं थके हुए हूं, यह है कि आप मॉडल त्रुटियों को कैसे संभालेंगे, और आपके व्यूमोडेल में कुछ विशेषताओं होनी चाहिए।

public class CustomerViewModel 
    { 
    public CustomerModel Customer { get; set; } 

    [RegularExpression(@"^\d{3}$")] 
    public string Phone1a { get; set; } 
    [RegularExpression(@"^\d{3}$")] 
    public string Phone1b { get; set; } 
    [RegularExpression(@"^\d{4}$")] 
    public string Phone1c { get; set; } 
    } 
+2

अंत में यह आमतौर पर कभी काम नहीं करता है। मॉडल लगभग हमेशा उस डेटा को समाप्त करते हैं जिसे आप उपयोगकर्ता को प्रदर्शित नहीं करना चाहते हैं। अब आप मॉडलों के लिए संपादक नहीं कर सकते हैं, और आप पोस्टिंग और जमा पर पोस्टिंग के जोखिम का जोखिम चलाते हैं। मुझे पता है कि यह बहुत मैपिंग है, लेकिन मुझे लगता है कि 'सरल' मॉडल मॉडल –

+0

अतिरिक्त RegExp विशेषताओं का उपयोग करने पर अच्छा विचार है। – SaltProgrammer

+0

क्या ग्राहक मॉडल को वास्तव में वैधता की जांच करने के लिए एनोटेशन की आवश्यकता है? मुझे लगता है कि केवल ViewModel को आवश्यकता विशेषताओं की आवश्यकता है। –

2

मुझे बस एमवीसी का लटका मिल रहा है, लेकिन मैंने कल इसी विषय पर शोध किया और इस निष्कर्ष पर पहुंचा कि किसी को सीधे व्यूमोडेल में मॉडल ऑब्जेक्ट शामिल नहीं करना चाहिए। तो मेरी समझ यह है कि ग्राहक ग्राहक मॉड्यूल में सीधे अपने ग्राहक मॉडल को शामिल करना एक बुरा अभ्यास होगा।

इसके बजाय, आप ग्राहक मॉडल से प्रत्येक संपत्ति को सूचीबद्ध करना चाहते हैं जिसे आप अपने व्यूमोडेल में शामिल करना चाहते हैं। तो फिर तुम तो स्वयं CustomerViewModel को CustomerModel से डेटा को मैप करने या अपने कार्रवाई विधि के इस अंदर की तरह कोड का एक लाइन के साथ AutoMapper जैसे उपकरण जो यह स्वचालित रूप से करता है का उपयोग करना चाहते:

public ViewResult Example() 
{ 
    // Populate/retrieve yourCustomer here 
    Customer yourCustomer = new CustomerModel(); 

    var model = Mapper.Map<CustomerModel, CustomerViewModel>(yourCustomer); 

    return View(model); 
} 

इस मामले में, Mapper.Map एक ग्राहक दृश्य मॉड्यूल लौटाएगा जिसे आप अपने दृश्य में भेज सकते हैं।

आप भी अपनी Application_Start विधि में निम्नलिखित को शामिल करने की आवश्यकता होगी:

Mapper.CreateMap<CustomerModel, CustomerViewModel>(); 

सामान्य तौर पर मैं AutoMapper बहुत काम करने के लिए प्राप्त करने के लिए आसान पाया। फ़ील्ड नाम मिलान होने पर यह स्वचालित होता है, अगर वे आपके पास नेस्टेड ऑब्जेक्ट नहीं करते हैं, तो आप CreateMap लाइन में उन मैपिंग निर्दिष्ट कर सकते हैं। तो अपने CustomerModel अलग-अलग प्रॉपर्टी के बजाय कोई पता वस्तु का उपयोग करता है, तो आप इस करना होगा:

Mapper.CreateMap<CustomerModel, CustomerViewModel>() 
    .ForMember(dest => dest.StreetAddress, opt => opt.MapFrom(src => src.Address.Street)); 

कृपया किसी को भी मुझे ठीक कर लें मैं गलत हूँ के रूप में मैं बस के रूप में अच्छी तरह से MVC के आसपास मेरे सिर हो रही है।

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