2013-06-05 5 views
26

Ho voluto inserire un'immagine casuale su ogni viewpage del mio progetto mvc. Così ho creato un metodo che restituisce un partialView e chiama quel metodo nella pagina Layout condivisa.Un metodo di azione pubblica '..' non è stato trovato sul controller '..'

Questo funziona correttamente quando provo ad accedere con un nome utente e una password corretti. L'usato è loggato e ogni pagina contiene un'immagine casuale. Ma quando fornisco la combinazione non valida di nome utente e password. La pagina di layout condivisa non trova il controller che voglio chiamare con il mio @Html.Action e attualmente la vista di login dovrebbe essere restituita con un messaggio di errore 'combinazione non valida di nome utente e password' e ofcourse, con l'immagine casuale.

InnerException:

{ "Un metodo di azione pubblica 'RandomSponsor' non è stato trovato sul regolatore 'Project.WebUI.Controllers.HomeController'"}

mio Html.Action in comune disposizione.

@Html.Action("RandomSponsor", "Home") 

Metodo nel homecontroller.

[HttpGet] 
[ChildActionOnly] 
public ActionResult RandomSponsor() 
{ 
    var model = service.getRandomSponsor(); 
    return PartialView("RandomSponsor", model); 
} 

Il metodo getRandomSponsor funziona bene, questo restituisce sempre un valore stringa casuale che viene restituito alla vista RandomSponsor.cshtml.

RandomSponsor.schtml (contiene solo la stringa immagine)

<img src="~/Content/Images/Advert/@(Model)" alt="a" /> 

ho cercato nel web per questo problema, ma non ha trovato una soluzione, qualcuno sa la risposta a questo? Potrebbe essere qualcosa con HttpGet di HttpPost?

Saluti.

+0

puoi pubblicare la definizione della tabella del percorso? (RegisterRoutes in global.asax) e anche la definizione del controller che ha azione RandomSponsor(). –

+0

Ho aperto un bug per questo https://aspnetwebstack.codeplex.com/workitem/2295 –

+0

Stavo ricevendo lo stesso errore usando Mozilla Firefox 45. Facendo la stessa cosa con Google Chrome 48.0.2564.116 m, il problema è finito. Nel mio caso sono coinvolti alcuni JavaScript e ho il sospetto che questo sia il problema. – JayJay

risposta

59

Se la richiesta di esecuzione è POST, tenterà di trovare un metodo RandomSponsor accettando HttpPost. Se ha senso, è possibile rimuovere HttpGet e che dovrebbe fare il trucco.

Questo può succedere anche se si dispone di molti strati di chiamate che iniziano con un POST (avevo un'azione di richiamo vista, restituendo una visione parziale chiamando RenderAction), poi la chiamata a RenderAction sarà ancora cercare un metodo POST

+7

Ok, ho visto questo e non è stato registrato all'inizio; se hai * molti layer * di chiamate che iniziano con un POST (ho avuto un'azione che restituisce una vista che restituisce una vista parziale che chiama RenderAction), allora la chiamata a RenderAction cercherà * ancora * di cercare un metodo POST. Spero che impedisca a qualcun altro di trascorrere quattro ore su questo :) –

+1

Come risolvere questo problema non rimuovendo l'attributo '[HttpGet]'? Voglio inviare i valori del percorso al metodo tramite GET, non POST. – pt12lol

+0

Oh ho trovato una soluzione. La vista è stata chiamata da POST e ha escluso il caricamento di '@ Html.Action()' da GET. – pt12lol

-1

Hai fatto un tentativo con Html.RenderAction? Solitamente è più veloce di Html.Action in quanto interagisce direttamente nel flusso di risposta anziché costruire una stringa.

È possibile visualizzare i seguenti argomenti per ulteriori informazioni:

Un'altra cosa da notare è che per Html.Action o Html.RenderAction, la vista non ha bisogno di essere nella cartella condivisa, necessaria solo se si utilizza Html.Partial o Html.RenderPartial

4

Questo può succedere anche se si dispone di molti strati di chiamate che iniziano con un POST (avevo un'azione di richiamo una vista restituire una vista parziale chiamando RenderAction), poi la chiamata a RenderAction sarà ancora cercare un metodo POST

Molto simile a questo problema che ho avuto qui - How to solve "public action method 'methodActionName' was not found on controller 'controllerNameController'"

e se si desidera continuare ad accettare l'HTTP gET, verbo e risolvere il problema della richiesta di cascata posta in una richiesta gET aggiungere questo al tuo metodo

[AcceptVerbs (HttpVerbs.Get | HttpVerbs.Post)]

Tenete a mente che [HttpGet] è lo stesso di [AcceptVerbs (HttpVerbs.Get)]

0

ricevuto questo errore all'improvviso di parecchi PartialViews diversi (non tutti loro) durante la personalizzazione di un'installazione di MVCForum. Non avevamo apportato alcuna modifica ai metodi o ai punti di vista relativi agli errori, quindi era davvero frustrante il motivo per cui erano stati violati.

Dopo aver provato le altre soluzioni su questo post e altri, è tornato indietro attraverso le modifiche apportate e quello che ha finito per fermare gli errori era che avevamo cambiato i binding in IIS in un altro dominio che aveva l'url 'applicare lower case url' Regola di riscrittura abilitata.

Quando abbiamo disattivato la regola in minuscolo forzata, gli errori si sono interrotti e il sito ha funzionato come previsto. Non è un problema di riscrittura dell'URL (non credo) perché siamo in grado di imporre a WWW il suo utilizzo senza errori. È un problema di riscrittura in minuscolo. Non importava se avessimo la regola minuscola prima o dopo la regola www.

Questa soluzione probabilmente non si applica a molti casi di questo errore, ma ha funzionato per noi. Speriamo che qualcun altro possa beneficiare di una soluzione così semplice.

Problemi correlati