Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

ASP.NET MVC form με ορισμένα μόνο πεδία ενός object

Îåêßíçóå áðü ôï ìÝëïò billaraw. Τελευταία δημοσίευση από το μέλος iwannis στις 10-12-2010, 07:10. Υπάρχουν 1 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  09-12-2010, 22:18 61418

    ASP.NET MVC form με ορισμένα μόνο πεδία ενός object

    Χαίρεται,

    Είναι το πρώτο μου post άρα ζητάω από το dotnetzone ένα δυνατό χειροκρότημα!

    Παρατηρούσα τον κώδικα αυτού εδώ του demo http://www.progware.org/Blog/page/ITPRODev-Connections-2010-Material.aspx

    Μου δημιουργήθηκε η εξής απορία. Λοιπόν μέσα τον φάκελο SoftwareForSale.Improved\SoftwareForSale.WebMVC\Views\Applications έχει το αρχείο Edit.aspx όπου έχει όλα τα πεδία του SoftwareForSale.Logic.Application. 

    Όταν κάποιος κάνει submit τη φόρμα λοιπόν στον controller βλέπουμε αυτό 
    public ActionResult Edit(Application UpdatedApp)
            {
                if (ModelState.IsValid)
                {
                    _appRep.PersistChanges(UpdatedApp);
                    TempData["Result"] = "Success!";
                    return RedirectToAction("Products", "Applications");
                }
                else
                {
                    return View(UpdatedApp);
                }
            }
    Βλέπουμε ότι όταν κάποιος κάνει edit από τη φόρμα περνούν τα δεδομένα σαν ένα object UpdatedApp όπου έχει όλα τα πεδία έτσι όπως τα θέλουμε. Και μετά στο repository περνάμε το object όπου τρέχει τον παρακάτω κώδικα όπου αποθηκεύει το object μας
    Application App=Ctx.Applications.Where(x => x.Id == AppToUpdate.Id).FirstOrDefault();
                    Ctx.ApplyCurrentValues("Applications", AppToUpdate);
                    Ctx.SaveChanges();
    Μου δημιουργήθηκε η εξής απορία. Μπορούμε να κάνουμε το ίδιο όμως στο Edit.aspx να έχει ορισμένα πεδία μόνο του "Application";
    Το πρόβλημα που θα δημιουργούνταν θα ήταν το εξής θα περνούσε το UpdatedApp και θα είχε σαν NULL τα πεδία που δεν υπήρχαν στη φόρμα και μετά το repository θα αποθήκευε μόνο τα πεδία που είχε ο φόρμα και όλα τα άλλα θα τα έβαζε NULL!
    Πώς θα μπορούσαμε λοιπόν να το κάνουμε έχοντας μία φόρμα με μερικά μόνο πεδία του Application και όχι όλα.
    Κάτι που σκέφτηκα ήταν ότι θα μπορούσαμε να περάσουμε στο repository και το ModelState.Keys και από 'κεί στο repository με ένα foreach να αποθηκεύαμε ένα ένα τα πεδία. Όμως δεν μου αρέσει και είμαι σίγουρος ότι θα υπάρχει πιο κομψός/σωστός τρόπος.
    Έχετε καμιά ιδέα;
    Δε δέχομαι την άποψη βάλε hidden τα υπόλοιπα!
  •  10-12-2010, 07:10 61421 σε απάντηση της 61418

    Απ: ASP.NET MVC form με ορισμένα μόνο πεδία ενός object

    Γεια χαρά,

    στο παράδειγμα το Application είναι ένα αντικείμενο του Business/Data Access Layer το οποίο εμφανίζεται στο View αφού μεταφέρεται ως εχει και δεν επιθυμείται τίποτα παραπάνω. Ένας τρόπος να αντιμετωπίσεις το ζήτημα που αναφέρεις είναι να φτιάξεις στο MVC project (συνήθως μέσα στον φάκελο Models για καλύτερη οργάνωση) ένα αντικείμενο με όνομα πχ ApplicationViewModel το οποίο θα περιέχει τα properties που επιθυμείς να διαχειριστείς, αυτό θα περνάς στο View και αυτό θα απεικονίζεις κατόπιν στο Application αντικείμενο που θα σώσεις στη βάση σου στο Post.

    Υπάρχουν ωστόσο περιπτώσεις που όντως επιθυμεί κάποιος να αποκλείσει από το model binding κάποια properties του αντικειμένου. Ο πρώτος τρόπος είναι να βάλεις στο αντικείμενό σου είτε στην παράμετρο του Action ή στη δήλωση της κλάσης του Exclude/Include attributes. Στο παράδειγμα που αναφέρεις όμως νομίζω ότι η πιο βολική λύση είναι η παρακάτω:

    Έχεις το αντικείμενο Client:

    public class Client
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    Στο action για το POST:

    public ActionResult Post()
    {
        Client client=new Client();
        client.FirstName="John";
        UpdateModel(client, "", null,new string[] {"FirstName"});
        return RedirectToAction("Index");
    }

    Στο view είχε περάσει ένα Client object προς επεξεργασία. Το model binding γίνεται από την UpdateModel και όχι αυτόματα όπου ζητάμε στην 4η παράμετρο να εξαιρεθεί το property FirstName. Επίσης το αντικείμενο το φτιάξαμε εμείς και όχι ο Model binder. Θα μπορούσες να φέρεις από το Repository σου το Application και κατόπιν να καλέσεις την UpdateModel including/excluding μόνο τα properties που επιθυμείς.

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems