2013-01-02 8 views
26

Ho una forma mvc (realizzato da un modello) che quando forniti, voglio ottenere un parametro Ho il codice per impostare la forma e ottenere il parametroInvio forma e passare dati al metodo del controllore di tipo FileStreamResult

using (@Html.BeginForm("myMethod", "Home", FormMethod.Get, new { id = @item.JobId })){ 
} 

e dentro il mio controller casa ho

[HttpPost] 
    public FileStreamResult myMethod(string id) 
    { 
     sting str = id; 

    } 

Tuttavia, ho sempre arrivare l'errore

La risorsa che stai cercando (o una delle sue dipendenze) potrebbe essere rimossa, il suo nome è stato modificato o temporaneamente non è disponibile . Controlla il seguente URL e assicurati che sia scritto correttamente.

Quando Tralascio il [HttpPost], il codice esegue file, ma le variabili str e id sono nulli. Come posso risolvere questo per favore?

EDIT

questo può essere causato a causa myMethod nel controllore non è un ActionResult? Mi sono reso conto che quando ho un metodo di tipo Actionresult in cui il metodo è associato a una vista, tutto funziona bene. Ma il tipo FileStreamresult non può essere associato a una vista. Come posso passare i dati a tali metodi?

+0

Si sta specificando un GET nella dichiarazione del modulo, ma si aspetta che chiami il metodo POST? –

+0

Ho tentato di omettere anche HttpPost ma le mie variabili str e id sono sempre nulle. e ho provato a cambiare il formmethod per postare ma nessuna differenza. – jpo

+0

La tua vista è fortemente digitata? –

risposta

40

In caso di dubbi, seguire le convenzioni MVC.

Creare un ViewModel se non l'hai già che contiene una proprietà per JobID

public class Model 
{ 
    public string JobId {get; set;} 
    public IEnumerable<MyCurrentModel> myCurrentModel { get; set; } 
    //...any other properties you may need 
} 

Fortemente digitare la vista

@model Fully.Qualified.Path.To.Model 

Aggiungi un campo nascosto per JobId alla forma

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post)) 
{ 
    //...  
    @Html.HiddenFor(m => m.JobId) 
} 

E accettare il modello come parametro nell'azione del controller:

[HttpPost] 
public FileStreamResult myMethod(Model model) 
{ 
    sting str = model.JobId; 
} 
+0

Il modello è di tipo IEnumerable. Vedere la modifica – jpo

+0

@jpo in Risposta alla modifica: ciò che si sta restituendo dal metodo POST non ha assolutamente alcun effetto sul collegamento del modello. Per quanto il tuo modello sia un oggetto IEnumerable, aggiungilo al modello di visualizzazione (vedi modifica). Se segui lo schema che ho delineato qui, non dovresti avere problemi. –

+0

Ci proveremo. Say JobId è un elemento di myCurrentModel, come faccio a inizializzare la stringa str? Ho provato sting str = model.single(). JobId ma ottengo l'errore "Sequence contiene più di un elemento" – jpo

12

Questo perché è stato specificato il metodo di modulo come GET

Modifica del codice nella visualizzazione a questo:

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post, new { id = @item.JobId })){ 
} 
3

Sembra che tu stia specificando il modulo per utilizzare un HTTP 'GET' richiesta utilizzando FormMethod.Get. Questo non funzionerà a meno che tu non dica di fare un post in quanto è ciò che ti sembra che ActionResult faccia. Questo probabilmente funzionerà cambiando FormMethod.Get a FormMethod.Post.

Oltre a ciò, si può anche pensare a come funzionano le richieste Get e Post e come queste interagiscono con il Modello.

3

qui il problema è il modello vincolante se si specifica una classe allora il modello di legame può capire durante il post, se è un numero intero o una stringa, allora è necessario specificare il [FromBody] per legare in modo corretto.

apportare le seguenti modifiche a FormMethod

using (@Html.BeginForm("myMethod", "Home", FormMethod.Post, new { id = @item.JobId })){ 

}

e dentro il controller di casa per il legame della stringa è necessario specificare [FromBody]

using System.Web.Http; 
[HttpPost] 
public FileStreamResult myMethod([FromBody]string id) 
{ 
    // Set a local variable with the incoming data 
    string str = id; 

} 

FromBody è disponibile in Sistema. Web.Http. assicurati di avere il riferimento a quella classe e l'hai aggiunto nel file cs.

+0

FromBody non è riconosciuto :(Vedi modifica – jpo

+0

assicurati di avere un riferimento a System.Web.Http; –

Problemi correlati