MVC postback problem   otázka

ASP.NET MVC, .NET

Ahoj, začal jsem používat MVC a jelikož jsem doteď pracoval s Web Forms, mám trochu problém se zorientovat v dané situaci:

Používám pro design _layout a potřebuji mít na všech stránkách kontaktních formulář. Takže si ho přidám pomocí beginForm, přičemž když někdo přes něj odešle zprávu, tak se zavolá POST na controller/akce. Dosud vše ok, nicméně nyní potřebuji uživateli vrátit buď zprávu o tom, že se daná situace podařila, nebo model s vyplněnými daty a uživateli oznámit, že se zprávu nepodařilo odeslat. Otázka zní, jak toho docílit - jak pošlu model z controlleru (kde se právě vyřizuje postback) do _layoutu a redirectnu uživatele na tu stránku, ze které přišel (rozuměj - postback se dá odeslat z jakéhokoliv view, které implementuje layout)?

Snad jsem to popsal dostatečně srozumitelně.

Děkuji za odpověď

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Asi jsem úplně nepochopil, v čem máte konkrétně problém. A rozhodně bych tomu pokud se jedná o MVC neříkal "postback".

V controleru napíšete akci pro submit formuláře tj. HttpPost. Ta dostane data - Model vstupním parametrem. Data se můžou zpracovat a pak vrátíte view se zprávou že vše proběhlo v pořádku. V případě chyby můžete vrátit původní view, kde data již budou naplněná z modelu. Pro předání chybové zprávy můžete ve view využít ValidationSummary, a hlášku nastavit modelu pomoci AddModelError.

/// <summary>
/// Submit from form
/// </summary>
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Odeslani(LoginViewModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        try
        {
            //Akce
            //Zobrazení view s hláškou OK
        }
        catch (Exception ex)
        {
            ModelState.AddModelError("", ex.Message);
        }
    }

    //If we got this far, something failed, redisplay form
    return View(model);
}

Zkuste poslat kód jak to teď máte vy.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tomu rozumím, ale jde mi o to, že mám 1 formulář, který je sdílený napříč všemi view, tzn je v _Layoutu pomocí @Html.Partial("_Form", new Model()) a ne jako samostatné view. Tzn, když ModelState není validní, nemohu zavolat View(model). Proto jsem zkoušel kód níže, nicméně končím v situaci, že View nebylo nalezeno. Vím, že do "return PartialView" mohu dát název daného PartialView, nicméně to se mi pak zobrazí pouze daný formulář, nikoliv celá stránka. Chápu, že bych to celé mohl vyřešit ajaxem (když už získávám formulář zpět).

// Controller

        [HttpPost]
        [ValidateAntiForgeryToken]
        public PartialViewResult Odeslani(Model model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    // Akce
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError("", ex.Message);
                }
            }

            return PartialView(model);
        }

Mým cílem bylo docílit chování jako u MasterPage ve Web Forms, tedy že mám v MP formulář, odešle se postback a když data nejsou validní, zobrazí se tatáž stránka s předvyplněnými daty. Asi něco chápu špatně... :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A nešlo by to řešit tak, že v případě chyby se uživateli zobrazí jiná (speciální) stránka, která bude jako svůj obsah mít pouze ten kontaktní formulář a ten obecný se naopak skryje (použije se jiný layout). Ten formulář by se před vyplnil tím chybným modelem a zobrazila chyba. Uživatel by pak dovyplnění toho formuláře provedl již na této speciální stránce (nebo odešel jinam).

V kódu by se tedy z post akce renderovalo vždy stejné (jedno) view.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji za odpověď, nicméně nepovažuji to za vhodné řešení. Identický kód na dvou místech aplikace považuji za anti-pattern.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to jsem neřešil.

Nepomoho by formulář dát do ~/Shared/EditorTemplates/ a použít EditorFor místo Partial?

Více viz:

http://stackoverflow.com/questions/10608...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback