7

मैं एक ASP.NET MVC 3 आवेदन विकासशील हूँ उपयोग करते हैं, मैं पहले के आदेश मेरे ऐप की कक्षाएं बनाने के लिए में इकाई की रूपरेखा कोड का उपयोग कर रहा है, और मैं भी है डीबीसीएन्टेक्स्ट और डीबीईएनटीटीएस परिभाषाओं को साफ करते हुए, इस पर संचालन करने के लिए एक भंडार।ASP.NET MVC - एक नया मॉडल बनाने या एक इकाई की रूपरेखा वर्ग

मेरा संदेह विचारों को प्रस्तुत करने और जिस तरह से एक संपादन मॉडल सहेजा गया है, उसके बारे में है।

अगर मैं इस इकाई है कि मेरी DB में संग्रहीत एक उपयोगकर्ता का प्रतिनिधित्व करते हैं:

//Entity: 
public class User 
{ 
    [Key] 
    public int IdUser { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
} 

और मुझे, प्रथम नाम, अंतिम नाम, ईमेल और NewPassword, ConfirmPasword और CurrentPassword के साथ एक दृश्य दिखाने के लिए आदेश में यह बताने के लिए चाहते हैं उपयोगकर्ता परिवर्तनों की पुष्टि करने के लिए CurrentPassword टाइप करते हुए अपना डेटा बदलते हैं, इसलिए मेरा संदेह है कि ConfirmPasword और CurrentPassword की तरह मेरी इकाई में नहीं है इसलिए मुझे इस दृश्य के लिए एक नया मॉडल बनाने की आवश्यकता है और मैं जिस जानकारी से चाहता हूं उसे कॉपी करें इसे बचाने के लिए मेरे डेटाबेस इकाई में मेरा नया मॉडल? जैसा:

public class UpdateUserModel 
{ 

    [Required] 
    [Display(Name = "Name")] 
    public string FirstName{ get; set; } 

    [Required] 
    [Display(Name = "Last Name")] 
    public string LastName{ get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Not valid email")] 
    public string Email { get; set; }  

    [DataType(DataType.Password)] 
    [Display(Name = "New password")] 
    public string NewPasword{ get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm the New Pasword")] 
    [Compare("NewPasword", ErrorMessage = "Password doesn´t mach.")] 
    public string ConfirmPasword{ get; set; } 

    [Required(ErrorMessage = "Need to specify the current password to save changes")] 
    [DataType(DataType.Password)] 
    [Display(Name = "Current Password")] 
    public string CurrentPassword { get; set; } 
} 

और नियंत्रक मैंने बनाया में:

public ActionResult UpdateUser(UpdateUserModel model) 
{    
    User u = (User)Membership.GetUser();    
    u.FirstName = model.FirstName; 
    u.LastName = model.LastName; 
    u.Email = model.Email; 

    if (!String.IsNullOrEmpty(model.NewPassword)) 
    { 
     u.Password = FormsAuthentication.HashPasswordForStoringInConfigFile(model.NewPassword.Trim(), "md5"); 
    } 

    repository.UpdateUser(u); 

    return View(); 
} 

रहे हैं इस तरह एक नियंत्रक होने करने के लिए किसी भी तरह:

public ActionResult UpdateUser(User u) 
{    
    repository.UpdateUser(u);    
    return View(); 
} 

क्योंकि अगर मेरे पास है कि, मैं कैसे इस विशिष्ट दृश्य के लिए सत्यापन करने के लिए, ConfirmPassword या CurrentPassword जैसे फ़ील्ड को जोड़ सकते हैं।

उत्तर

6

यदि मैं आप थे, तो मैं अपनी प्रस्तुति परत में डोमेन मॉडल का उपयोग नहीं करता। मैं एक दृश्य मॉडल (एक और कक्षा) तैयार करूंगा जो मेरे डोमेन मॉडल के समान ही होगा। इसके बाद मैं अपने डोमेन मॉडल से दृश्य मॉडल में मैप करने के लिए ऑटो-मैपिंग टूल का उपयोग करूंगा।

यह एक बहुत ही आम परिदृश्य है, इसलिए यदि आप गूगल "दृश्य और डोमेन" मॉडल के लिए आप सब कुछ आप की जरूरत खोजना चाहिए।

public class User { 
     [Key] 
     public int IdUser { get; set; } 
     public string UserName { get; set; } 
     public string Password { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Email { get; set; } 

} 

public class UpdateUserViewModel { 
    // Original fields 

    public string Password { get; set; } 

    public string PasswordConfirmation { get; set; 
} 

तब आप अपने बॉयलर प्लेट कोड निकालने के लिए स्वत: नक्शाकार कॉन्फ़िगर कर सकते हैं:

public ActionResult ShowUser() 
{ 
    var domainModel = new User(); // I'm assuming that properties are set somewhere 
    var viewModel = new UserViewModel(); 

    Autommaper.Map(domainModel, viewModel); 

    return View(viewModel); 
} 

यह बहुत किसी न किसी तरह है, लेकिन उम्मीद है कि आप अनुमान लगा सकें।

अद्यतन 1: **

के रूप में मैं समझ गया प्रत्येक दृश्य के लिए एक नया मॉडल बनाने और उसके बाद इकाई

यह सिर्फ बेहतर नहीं है में मैप करने के लिए बेहतर है, यह चिंताओं के बेहतर अलगाव प्रदान करता है, आपके कोड को आसानी से टेस्ट करने योग्य बनाता है। बस कक्षा के नाम को देखकर, मैं इसका उद्देश्य UpdateUserViewModel, RegisterUserViewModel इत्यादि देख सकता हूं)।

मूल फ़ील्ड, इस वर्ग में मान्यता के साथ मेटाडेटा माना जाता है और वह सामान नहीं है?

मूल क्षेत्रों से मेरा मतलब है:

public class UserViewModel{ 
    public string UserName { get; set; } 
    public string FirstName { get; set; } 

} 

ये फ़ील्ड्स आपके उपयोगकर्ता कक्षा में पहले से ही कर रहे हैं, तो मैं उन्हें फिर से में टाइप नहीं द्वारा अपने समय बचा लिया।

यह मेरा मॉडल एमवीसी से एमवीवीएम में बदल जाएगा या नहीं, मेरे पास अभी भी नियंत्रक है?

मुझे विश्वास है कि मैंने जो भी सुझाव दिया है वह अभी भी एमवीवीएम के बजाय एक एमवीसी पैटर्न है।

ऑटोमपर के बारे में, क्या आप github.com/AutoMapper/AutoMapper का उपयोग कर रहे हैं?

ऑटोमैपर कुछ ऐसा है जो मैंने उपयोग किया है। वहां कुछ उपकरण हैं और वे वही काम करते हैं। कुछ कोशिश करें और अपनी आवश्यकताओं के अनुरूप सबसे अधिक ढूंढें।

शुभकामनाएं।

+1

ठीक है, मुझे यह मिल गया। जैसा कि मैंने समझा है, प्रत्येक दृश्य के लिए एक नया मॉडल बनाने के लिए बेहतर है और फिर इसे इकाई में मैप करें। इसका मतलब है कि मूल वर्ग, इस वर्ग में मान्यता के साथ मेटाडेटा माना जाता है और वह सामान नहीं है? यह मेरे मॉडल को एमवीसी से एमवीवीएम में बदल देगा या बेक्यूज नहीं होगा मेरे पास अभी भी नियंत्रक है? ऑटोमपर के बारे में, क्या आप https://github.com/AutoMapper/AutoMapper का उपयोग कर रहे हैं? – juan25d

+0

कृपया अद्यतन 1 –

+0

देखें तो मुझे सत्यापन और मेटाडेटा कहां लिखना चाहिए? क्लास UserViewModel में नहीं है? – juan25d

1

आमतौर पर मैं अपने प्रोजेक्ट के विभिन्न हिस्सों के लिए क्षेत्रों का उपयोग करता हूं, इस अतिरिक्त कोड को कहां रखा जाए।

आप अपने मॉडल फ़ोल्डर में एक viewmodel.cs कक्षा में जोड़ने जा रहे हैं। इस कक्षा के अंदर आपकी परिभाषाएं होंगी कि डेटा को डेटा में कैसे मॉडलिंग किया जाएगा। ये व्यूमोडेल उस इकाई के उन हिस्सों को प्रतिबिंबित करेंगे जिन्हें आप उपयोगकर्ता से बातचीत करना चाहते हैं। [HttpGet] के माध्यम से नियंत्रकों में बातचीत की जाएगी जहां आप दृश्य मॉडल में पारित होने के लिए पास करते हैं, और [HttpPost] जहां आप मॉडल को वापस भेजते हैं और फिर इसे किसी इकाई में मैप करते हैं।

ViewModels.cs:

public class UserViewModel 
{ 
public string UserName { get; set; } 
} 

SomeController:

public ActionResult getView() 
{ 
var uvm = new UserViewModel(); 
return View(uvm); 
} 

देखें getView.cshtml:

नियंत्रक में
@model project.namespace.UserViewModel 

@using (Html.BeginForm()) 
{ 
@Html.EditorFor(m => m.UserName) 
<input type="submit" value="New User Name" /> 
} 

वापस

[HttpPost] 
public ActionResult getView(UserViewModel model) 
{ 
var entity = new ActualEntity(); 
entity.username = model.UserName; 
//more mapping 
//commit changes somewhere 
return RedirectToAction("getView"); 
} 
+0

यह मेरे पास अब कम या ज्यादा है, समस्या यह है कि मैं अपनी इकाई को मॉडलव्यू और उपाध्यक्ष में हर बार मैप करने की समस्या को छोड़ना चाहता हूं, लेकिन आपके उत्तर के साथ मुझे लगता है कि एक इकाई से देखने के लिए एक अलग सत्यापन/गुण रखने का एकमात्र तरीका। धन्यवाद! – juan25d

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