41 messaggi dal 09 gennaio 2012
Ciao a tutti
ho un controller Prodotto che ha 2 azioni: "modifica" che prende l'id del prodotto e restituisce un oggetto model di tipo Prodotto. Bene, il form si popola di campi per la modifica dei dati. Poi mando il tutto a una action di nome "aggiorna". Qui faccio i controlli manualmente e se manca qualcosa vorrei rimandare al form .
Come fare ?
ho provato con

if(ModelState.IsValid==false){
return RedirectToAction("modifica"); // non funziona
}

vorrei mostare il form con i dati (o gli originali i quelli modificati dall'utente)
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
reindirizzando a Modifica si perdono tutti i dati che l'utente aveva digitato fino a quel momento. Poi, vedo che nel RedirectToAction manca l'id del prodotto, forse è per quello che non sta funzionando.

Prova invece a rinominare la tua action "Aggiorna" in "Modifica", e decorala con l'attributo [HttpPost]. Questa seconda action "Modifica" va ad aggiungersi a quella che avevi già, e si occuperà di ricevere i dati dal POST. Se il ModelState non dovesse essere valido, puoi subito restituire la View passandole l'oggetto Prodotto così come ti è arrivato.

Ecco un esempio:
[HttpGet]
public ActionResult Modifica(int idProdotto)
{
    //qui ottieni il tuo prodotto usando i metodi del business layer
    var prodotto = TuoRepository.OttieniProdottoDaId(idProdotto);
    //e lo passi alla view, come stai già facendo
    return View(prodotto);
}

// Questa è l'action che riceve i dati dal form
[HttpPost]
public ActionResult Modifica(int idProdotto, Prodotto prodotto)
{
    if (ModelState.IsValid){
        //i dati erano validi, quindi posso salvare il prodotto e reindirizzare all'indice
        TuoRepository.Salva(prodotto);
        return RedirectToAction("Index");
    } else {
       //oops, i dati non erano validi, restituisco subito la view
       //Dato che anche questa action si chiama "Modifica", la view usata sarà la stessa
       return View(prodotto);
    }
}


...questo codice è molto simile a quello che ti genera Visual Studio 2013 quando crei un controller usando l'opzione di scaffolding "Controller MVC con azioni di lettura/scrittura".
http://www.asp.net/visual-studio/overview/2013/aspnet-scaffolding-overview

ciao,
Moreno
Modificato da BrightSoul il 08 gennaio 2015 23.39 -

Enjoy learning and just keep making
41 messaggi dal 09 gennaio 2012
Grazie moreno !
Ho capito tutto.
Ma una domanda, non per insistere ma per capire: se volessi comunque chiamare le azioni in modo diverso "modifica" la prima e "aggiorna" la seconda, c'e' modo di tornare ad "aggiorna" con i dati ?
Ho provato varie soluzioni ma non vanno

RedirectToAction("modifica?idProd="+oggProdotto.idProd);
e altre varianti

come si fa (sempre che sia possibile ) ?

un grazie e ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, prego!

alvaropetro ha scritto:
c'e' modo di tornare ad "aggiorna" con i dati ?

Sì, puoi farlo in due modi.

Col primo continui ad usare il metodo View(), o meglio, il suo overload che ti consente di indicare il nome della view da usare
return View("Modifica", prodotto);

In questo modo non ha importanza come si chiami l'action, perché qui espliciti il nome della View da usare.

In alternativa, puoi anche usare il Redirect ma devi portarti dietro l'intero oggetto Prodotto usando il TempData. Leggi questo articolo di Marco De Sanctis.
http://www.aspitalia.com/script/989/Scambiare-Informazioni-Controller-ASP.NET-MVC.aspx
Il TempData è un dizionario che si appoggia alla Session di ASP.NET per far "sopravvivere" un oggetto ad un redirect. Dopo il redirect però viene svuotato automaticamente, quindi ha un uso molto specifico.

In un modo o nell'altro, l'importante è che l'oggetto Prodotto non vada perso, perché contiene i dati che l'utente magari ha impiegato svariati minuti a compilare.

Io comunque ti suggerirei di evitare il Redirect. Il TempData aggiunge una piccola complessità in più che puoi evitare, a meno che non ci siano necessità particolari.

alvaropetro ha scritto:

RedirectToAction("modifica?idProd="+oggProdotto.idProd);


Prova così, i valori per la route dovresti passarli come proprietà di un oggetto anonimo.
return RedirectToAction("Modifica", new { idProd = oggProdotto.idProd });


ciao,
Moreno
Modificato da BrightSoul il 09 gennaio 2015 01.16 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.