Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    ASP.NET MVC 2 passaggio valori

    Ciao a tutti,
    non saprei come risolvere il problema in asp.net mvc 2.

    Ho un controller che esegue una query e genera una vista in cui devono apparire, in lista o con dropdownmenu, i risultati della query.
    Cliccando su una voce, il valore della voce deve passare ad un secondo controller, dove servirà per eseguire altre operazioni.

    Saprei come farlo in php, ma essendo alle prime armi con asp.net mvc non so come fare!

    Grazie mille a chi mi saprà aiutare!

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    se vuoi farlo attraverso un link cliccabile devi costruirti il link compreso di valori querystring a mano, qui gli helper method ti vengono incontro perche ti consentono di costruire il link attraverso il metodo actionlink, se per esempio devi passare un ID alla action del secondo controller, questo codice:
    codice:
    <%: Html.ActionLink("Azione2","Controler2", new { id = Model.ID }%>
    genera un tag a con il link che porta a quela action compresa di query string. A questo punto se hai una route configurata (nel caso precedente basta quella di default) invece che la querystring vedrai un link piu seo friendly.

    se invece vuoi farlo attraverso il dropdownmenu, un pulsante ecc. devi inviare un form a questa action indicando nel form la route che porta alla stessa. Se guardi i parametri dell'helper method Html.BeginForm vedrai che c'è qualcosa simile ad actionLink dove puoi indicare controler, action e parametri.

    Nel caso del'invio della form il controller ricevente deve avere tra i suoi parametri la FormCollection (che è una dictionary con tutti i valori del form) tra i suoi parametri di input e chiamarsi Collection (altrimenti non funziona):
    codice:
    [HttpPost]
    public ActionResult Index(FormCollection Collection)
            {
    ...
    }
    Se approccio di usare una dictionary potrebbe sembrare poco object oriented, puoi avvalerti del modelbinder, puoi costruirtene uno tu o usare quello di default. Il model binder altro non fa che associare i valori della form inviata ad un oggetto di una classe. Affinche questo avvenga il form deve inviare davvero dati bindabili su quella specifica classe con i nomi dei campi del form che corrispondono ai nomi delle props della classe. Il lavoro diventa abbastanza facile se nella view usi gli helper method EditorFor o DisplayFor ecc. E' importante che la firma della action sia del tipo:

    codice:
    [HttpPost]
    public ActionResult Index(Tipo tipo)
            {
    ...
    }
    il parametro di input deve chiamarsi come la classe ma con le lettere in minuscolo. A quel punto nella action puoi usare la variabile tipo che ti è stata passata dalla form view. In realtà dietro le quinte c'è stato un lavoro di copia e conversione dei valori stringa presenti nella form verso le proprietà dell' oggetto.

  3. #3
    Ciao rsdpzed,
    grazie mille per la tua spiegazione, è davvero esaustiva.

    Ho provato il primo metodo e mi genera correttamente il link ed inserisce come ID il valore su cui clicco.
    Nel controller ricevente, come faccio a memorizzare quel valore, ad esempio in una stringa di nome valorericevente ?

    Grazie mille per la pazienza.

  4. #4
    Ecco l'ActionLink che ho creato:
    <%: Html.ActionLink(x.ToString(),"Tablatura","../Tablatura",new { id = x}) %>

    Sul link appare il testo prodotto da x.ToString(), deve puntare al metodo Tablatura, però essendo su un altro controller, non riesco ad indirizzarlo.

    Ho provato anche così:
    <%: Html.ActionLink(x.ToString(),"Tablatura","Tablatur a",new { id = x}) %>

    ma non riesco a beccare il controller.

    All'interno di TablaturaController ho inserito, nella ActionResult, (string id).

    Help!

  5. #5
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    visual studio ti aiuta a trovare l'overload giusto di quell'helper (ce ne sono una decina), quando apri la parentesi tonda appare intellisense e basta cliccare sulle frecciette nere che ti fanno scorrere i vari overload. In ogni caso quando devi passare anche il nome del controller la firma da usare è questa:

    ActionLink(string testo, string action, string controller, object routevalues, object htmlAttribute);

    percio:

    codice:
    <%: Html.ActionLink(x.ToString(),"Tablatura","Tablatura",new { id = x}, null) %>
    per rispondere alla prima domanda, il controller che riceve deve avere in firma un parametro di nome id di tipo string altrimenti quel link ti genera un eccezione una volta cliccato per cui:

    codice:
    public ActionResult Tablatura(string id)
    {
    ...
    }
    a parametro query string corrisponde parametro in input del metodo action. La cosa come ti dicevo puo essere piu object oriented se si sfrutta il model binder come ti spegavo su.

    In realtà anche cosi il modelbinder entra in azione perche in fondo id è un valore querystring che viene passato e convertito ad un oggetto .net (la stringa in questo caso, ma poteva essere anche un int o un datetime). Se avessi avuto due parametri querystring (id e nome) il model binder sa riconoscerli solo perche PER CONVENZIONE i parametri del action method hanno LO STESSO nome dei parametri quesristring. Se per esempio il parametro di Tablatura invece di chiamarsi "id" lo rinominassi in "key" il gioco non funzionerebbe più. Questo fatto del model binder è solo un aiuto che ti leva la rogna di scrivere codice del tipo:

    try
    {
    id = Convert.ToInt32(Request.QueryString["ID"]);
    }
    per ogni proprietà

    In realtà potresti anche non avvalerti di questo sistema (scelta ovviamente deprecabile). Per farti capire nonostante la route, il link seo friendly ecc. potresti anche fare:

    codice:
    public ActionResult Tablatura()
    {
     id = Convert.ToInt32(Request.QueryString["ID"]);
    }

  6. #6
    Ciao rsdpzed,
    sei stato davvero gentilissimo, adesso funziona tutto correttamente.

    Grazie per le informazioni, ne farò tesoro e spero di poter ricambiare presto il favore.

    A presto,
    Jacklipari

  7. #7
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    di nulla, solo una precisazione, l'ultimo pezzo di codice comq solleva un eccezione perche non la firma del metodo è vuota.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.