2013-01-02 14 views
26

Mam formularz mvc (z modelu), który gdy przedłożone, chcę uzyskać parametr Mam kod, aby ustawić formę i uzyskać parametrSkładając formularz i przekazać dane do metody kontrolera typu FileStreamResult

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

i wewnątrz mojego kontrolera domu mam

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

    } 

ja jednak zawsze pojawia się błąd

Zasób, którego szukasz (lub jedna z jego zależności) mógł zostać usunięty, miał zmienioną nazwę lub tymczasowo jest niedostępny. Sprawdź następujący adres URL i upewnij się, że jest on poprawnie zapisany.

Kiedy pominąć [HttpPost], kod uruchamia plik ale zmienne str i id są nieważne. Jak mogę to naprawić?

EDIT

Może to być spowodowane bo myMethod w sterowniku nie jest ActionResult? Zdałem sobie sprawę, że gdy mam metodę typu Actionresult, gdzie metoda jest związana z widokiem, wszystko działa dobrze. Ale typ FileStreamresult nie może być powiązany z widokiem. Jak mogę przekazać dane do takich metod?

+0

Podajesz GET na deklaracji formularza, ale oczekujesz, że wywoła ona twoją metodę POST? –

+0

Próbowałem pomijając HttpPost, ale moje zmienne str i id są zawsze puste. i próbowałem zmienić metodę formularza, aby opublikować, ale bez różnicy. – jpo

+0

Czy Twój widok jest mocno napisany? –

Odpowiedz

40

W przypadku wątpliwości należy przestrzegać konwencji MVC.

Utwórz viewmodel jeśli nie już, że zawiera właściwość dla jobid

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

stanowczo wpisać widok

@model Fully.Qualified.Path.To.Model 

Dodaj ukryte pole dla jobid do formularza

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

Przyjmij model jako parametr w działaniu kontrolera:

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

Model jest typu IEnumerable. Zobacz edycję – jpo

+0

@jpo w odpowiedzi na twoją edycję: to, co wracasz z metody POST, nie ma absolutnie żadnego wpływu na powiązanie modelu. O ile Twój model jest IEnumerable, po prostu dodaj go do modelu widoku (patrz edit). Jeśli zastosujesz się do wzoru, który tutaj opisałem, nie powinieneś mieć żadnych problemów. –

+0

Spróbuję tego. Powiedz JobId jest elementem myCurrentModel, jak zainicjować ciąg znaków? Próbowałem sting str = model.single(). JobId, ale pojawia się błąd "Sekwencja zawiera więcej niż jeden element" – jpo

12

To dlatego, że podałeś metoda formularz jak GET

Zmień kod w widoku do tego:

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

Wydaje się, że określenie formy użyć HTTP „get” żądanie przy użyciu FormMethod.Get. To nie zadziała, jeśli nie powiesz mu, aby zrobił post, ponieważ wydaje ci się, że chcesz, aby ActionResult to zrobił. Prawdopodobnie zadziała to po zmianie FormMethod.Get na FormMethod.Post.

Poza tym warto również zastanowić się, w jaki sposób działają zlecenia pobierania i wysyłania wiadomości oraz jak oddziałują one na model.

3

tu problem jest wzór wiążący jeśli określić klasę następnie wiązanie model może zrozumieć go podczas postu, jeśli liczba całkowita lub ciąg następnie trzeba określić [FromBody], aby związać poprawnie.

dokonać następujących zmian w FormMethod

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

}

i wewnątrz kontrolerze domu do wiązania ciąg należy określić [FromBody]

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

} 

FromBody jest dostępny w systemie. Web.Http. upewnij się, że masz odwołanie do tej klasy i dodał ją w pliku cs.

+0

FromBody nie jest rozpoznawany :(Patrz edytuj – jpo

+0

upewnij się, że masz odniesienie do System.Web.Http; –