2009-04-22 16 views
13

Wiem, wiem, wiem. Nie powinienem robić formularzy sieciowych w MVC, całkowicie się z tym zgadzam. Ale ludzie, którzy podpisują moją pensję, nie zatwierdzą teraz całkowitej konwersji naszej witryny do MVC. Robimy krok po kroku krok po kroku, aby je przekonwertować, dodając nowe funkcje w MVC.ASP.NET MVC - czy IsPostBack nadal tu jest?

Moje pytanie brzmi: jak uzyskać dostęp do właściwości IsPostBack z kontrolera?

Edytuj: Aby dodatkowo wyjaśnić, mam formant użytkownika sieci na mojej stronie wzorcowej mvc, która może inicjować postbacks. Próbuję zidentyfikować te postsy wersetów posta mvc. W tym momencie myślę, że po prostu sprawdzę klucze formularza żądania dla klucza "__viewstate" i jeśli zostanie on znaleziony, potraktuj to jako odświeżenie.

+0

'public static bool IsPostBack (wniosek ten HttpRequestBase) {return __viewstate-something-something} 'jest prawdopodobnie najbardziej zbliżony do ciebie. Jednak umieszczenie elementów kontrolnych użytkownika Web Form na stronach wzorcowych MVC może spowodować problemy w przyszłych wersjach środowiska ASP.NET MVC. – bzlm

+0

Dlaczego nie powinniśmy używać formularzy internetowych w MVC? Używam formularzy internetowych. Ale nie jestem profesjonalistą. Co jeszcze możemy użyć innych niż formularzy internetowych? –

Odpowiedz

3

Kontrolery nie dziedziczą z System.Web.UI.Page. Nie ma właściwości isPostback.

+1

Widoki Engine View ASP.NET dziedziczą ze strony. –

+2

Stoję poprawione. Widoki mają. Kontrolery nie. –

0

Środowisko MVC nie obsługuje klasycznego postback i widoku używanego w formularzach WWW. Nie, nie masz dostępu do IsPostBack.

Moja rada to posiadanie dwóch oddziałów: jednej z aktualną witryną, w której dodajesz łaty znanych błędów, i drugiej, w której tworzysz nową witrynę od zera. W tym przypadku należy wdrożyć nowe funkcje. Zakładam, że większość twojej bazy kodów nadaje się do ponownego użycia w nowej witrynie.

Gdy nowa strona jest już gotowa, uruchom ją.

13

Nie ma IsPostBack - wszystko jest POST lub GET (lub innym czasownikiem HTTP). Możesz ograniczyć czasowniki HTTP dozwolone przez twoje działanie, tj. Nigdy nie zobaczysz żądania od niedozwolonego czasownika, używając AcceptVerbsAttribute. Na przykład poniższe tylko zezwala na POST.

[AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult Update(int id) 
    { 
    } 

Jeśli chcesz mieć taką samą nazwę działania mają zarówno GET/POST i faktycznie robią różne rzeczy, można też dać im oddzielne podpisów lub użyć ActionNameAttribute do aliasu jedno z działań więc metody mogą mieć różne nazwy.

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult List() 
    { 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult List(string filter, int page, int limit) 
    { 
    } 

LUB

[ActionName("List")] 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult ListDisplay() 
    { 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult List() 
    { 
    } 

EDIT: Zauważ, że Dodałem zabezpieczającym tokena walidacji działaniom POST. Naprawdę powinieneś używać tego do protect against cross-site scripting attacks.

+0

W rzeczywistości, podczas miksowania stron z mvc i webforms nadal istnieją post-back. Zobacz moją edycję powyżej. – chief7

0

Dlaczego próbujesz uzyskać tę wartość z poziomu kontrolera? Nie jestem pewien, czy to ci pomoże, ale nadal możesz używać tradycyjnego obiektu Request, aby uzyskać informacje, które zostały przesłane przez formularz ...

0

Nie jestem pewien, czy dobrze zrozumiałem twoje pytanie, ale na kontrolerze miałaby akcję, która obsłuży początkowy GET z przeglądarki i drugą akcję obsługującą testy POST.

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(MyModel model) 
{...} 

public ActionResult Create() 
{...} 
0

Na pewno przyjrzę się temu wpisowi na blogu Scotta Hanselmana, w którym umieści stronę aspx w aplikacji MVC.

http://www.hanselman.com/blog/PlugInHybridsASPNETWebFormsAndASPMVCAndASPNETDynamicDataSideBySide.aspx

kontrolerów nie będą mieli dostępu do właściwości viewstate.Nawet jeśli chciałbyś poradzić sobie z problemem __VIEWSTATE, musiałbyś trochę popracować, aby dostać go do użytecznego formularza w kontrolerze mvc. Życzymy powodzenia przy opracowywaniu strategii konwersji, niezależnie od tego, jak to działa, wiele osób byłoby zainteresowanych, gdybyś napotkał na problemy, które napotkasz w tym procesie.

32

W przypadku ktoś jeszcze jest zainteresowany, można przetestować za post od wewnątrz metody działania MVC tak:

if (Request.HttpMethod=="POST") { 

} 
+0

Dziękuję za to, to jest dokładnie to, co musisz zrobić w MVC! –

+2

NALEŻY UNIKAĆ WSZYSTKICH KOSZTÓW. Twój kod kontrolera powinien być uporządkowany według metod. Twoja metoda HttpGet, czyli [HttpGet] powinna być całkowicie oddzielona od twojej metody [HttpPost]. Istnieje wiele powodów, dla których testability to jedna, czytelność itd. Zobacz odpowiedź tvanfosson poniżej. –

+1

nadal pomocne w 2012 +1 dla tego –

0

Jeśli masz więcej niż jedną formę w stronę MVC, można dodać ukryty wprowadź w formularzu znaczący identyfikator i sprawdź, czy ma wartość. W ten sposób nie musisz mieć dwóch oddzielnych procedur obsługi (jeden dla get i jeden dla postu).

Więc inf stronę i wewnątrz postaci:

<input type="hidden" id="testForm" name="testForm" value="1"/> 

iw sterowniku:

if (Request.Form["testForm"] != null) 
     { 
     // ACTIONS FOR THE POSTED FORM 
     } 

Nadzieję, że to pomaga!

7

Można użyć tego fragmentu kodu w Razor

@if(IsPost) 
{ 
//dosomething 
} 
else 
{ 
//do some other thing 
} 
3

często korzystać z tej metody (zadeklarowanego na mojej klasy BaseController)

protected bool IsPostBack() 
{ 
    bool isPost = string.Compare(Request.HttpMethod, "POST", 
     StringComparison.CurrentCultureIgnoreCase) == 0; 
    if (Request.UrlReferrer == null) return false; 

    bool isSameUrl = string.Compare(Request.Url.AbsolutePath, 
     Request.UrlReferrer.AbsolutePath, 
     StringComparison.CurrentCultureIgnoreCase) == 0; 

    return isPost && isSameUrl; 
} 
Powiązane problemy