NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: ASP NET MVC - 2 POST z jedné stránky

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Adam Gajdečka:3.3.2018 21:34

Prosím o radu. Mám vytvořený viewModel, kde mám login a register. Potřebuji z jedné stránky možnost poslat přes POST jak login nebo POST register.

Vím, jak udělat POST, když mám jen jednu akci. Ovšem vím, že mohu definovat, do jaké akce se má POST provést. Problém je v tom, že budu případně potřebovat vracet errory pro uživatele.

Mám
//viewmodel obsahuje jak register tak login

[AllowAnonymous]
public ActionResult LoginToProgram(string slug, string currentFilter, string searchString, int? page)
{
        return View(viewModel);
}

[AllowAnonymous]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LoginToProgram(ProgramAboutModelView viewModel)
{
        //zde vyresim login, pripadne vratim viewModel s errory
        return View(viewModel);
}

//problem je pri registraci



[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> RegisterToProgram(ProgramAboutModelView viewModel)
{
        //tady muzu poslat register data, ale jak vratit errory na tu stránku LoginToProgram
        // a jak se vyhnout tomu abych nemusel nastavovat znovu data ktera obsahuje viewmodel
}

Jak tedy postupovat? Jaké je nejlepší řešení? Díky

 
Odpovědět
3.3.2018 21:34
Avatar
Fenrix
Člen
Avatar
Odpovídá na Adam Gajdečka
Fenrix:5.3.2018 7:41

možností je několik, ale nejrychlejší bude použít partial stránky
schéma by mohlo být následující: máš layout s renderbody() a renderpartial()
pak register.cshtml kam šoupneš html na registraci a jako model načteš register
pak vytvoříš partial stránku tam šoupneš login a login model
viewmodelem si vůbec nemusíš komplikovat život a můžeš ho smazat :)
samozřejmě register.cshtml a login.cshtml musíš mít ve stejný složce, která odkazuje na controller, co zprovavává login a registraci

Editováno 5.3.2018 7:43
 
Nahoru Odpovědět
5.3.2018 7:41
Avatar
Odpovídá na Adam Gajdečka
Marian Benčat:5.3.2018 10:11

Hledej flashMessages a temp data ;-)

Jde defakto o to, ze do temp data narveš errory a partial viewckem ten partial view vyrenderujes.. to partial view to taha z toho flashMessages.

Je to plně kompatibilní s PRG patternem.

Nahoru Odpovědět
5.3.2018 10:11
Totalitní admini..
Avatar
Odpovídá na Adam Gajdečka
Michal Štěpánek:5.3.2018 13:02

Errory, resp. zprávy pro uživatele se nezobrazují v jednotlivých stránkách, ale v Layoutu... Hodně ti pomůže místní tutoriál na E-shop v ASP.NET MVC, v sedmém díle tam je krásně a jednoduše popsaný systém zpráv pro uživatele.

Nahoru Odpovědět
5.3.2018 13:02
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Marian Benčat
Adam Gajdečka:6.3.2018 19:57

toto by možná bylo použitelné. Ovšem jde díky tomu narvat ty jednotlivé errory pod jednotlivé pole formuláře?

 
Nahoru Odpovědět
6.3.2018 19:57
Avatar
don.jarducius:6.3.2018 20:24

No, jelikož budeš obsluhovat 2 různé akce, i chyby z nich budou různé. V temp datech by sis měl posílat i z jaké akce se s chybou vracíš (předpokládám, že oba formuláře vidět nejsou, a ve výchozím stavu je vidět pouze přihlášení, nikoli registrace), potřebuješ totiž ideálně pokud se vracím s chybou z registračního procesu zobrazit rovnou registrační formulář. Chyby si pak můžeš vracet v tempdatech jako stringy errRegJmeno, errRegPrijmeni které zobrazíš pod příslušný polem, pokud nebude prázdný (není chyba). Nebo si to můžeš uložit do extra objektu.

Doufám, že jsem tě nezmátl.

Nahoru Odpovědět
6.3.2018 20:24
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Adam Gajdečka:6.3.2018 21:06

Je to celé moc komplikované. Kam mám posílat ty POST akce a kudy vracet s flashMessages a temp data?

 
Nahoru Odpovědět
6.3.2018 21:06
Avatar
Odpovídá na Adam Gajdečka
Michal Štěpánek:7.3.2018 7:51

Koukni se na prvních asi sedm dílů E-Shop v ASP.NET MVC, najdeš tam v podstatě všechny odpovědi na tyto otázky...

Nahoru Odpovědět
7.3.2018 7:51
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Adam Gajdečka:7.3.2018 23:19

Tak jsem to asi vyřešil. Ještě to musím dodělat. Problém byl pro mě vrátit errory, takže jsem použil FlashMessages - konkrétně https://www.exceptionnotfound.net/…ce-tempdata/

a následně Redirect.

Díky Marian Benčat za nakopnutí :-)

 
Nahoru Odpovědět
7.3.2018 23:19
Avatar
Adam Gajdečka:8.3.2018 7:08

Má konci metody udělám redirect, errrory tedy mám ale zase nemám naplněny formulář co uživatel špatně vyplnil. Co s tím?

 
Nahoru Odpovědět
8.3.2018 7:08
Avatar
Odpovídá na Adam Gajdečka
Michal Štěpánek:8.3.2018 8:42

Musíš tam naplnit a poslat ten model

Nahoru Odpovědět
8.3.2018 8:42
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Adam Gajdečka:8.3.2018 8:48

Jenže když já mám ty data v metodě RegisterToProgram a následně mám radirect na LoginToProgram, hlášku erroru strčim do flashMessages.

Ale jak předám ten vyplněny model?

 
Nahoru Odpovědět
8.3.2018 8:48
Avatar
Odpovídá na Adam Gajdečka
Michal Štěpánek:8.3.2018 11:11

Máš nějaký RegisterViewModel. Po vyplnění registerview odesíláš do Action [Httppost] v controlleru vyplněná data v tom RegisterViewModelu.
Pokud registrace skončí nějakým errorem, tak to přece nebudeš redirectovat na login, ale znovu zobrazíš ten registerview. Takže se jen přesvědčíš, že ten model obsahuje ta data, která uživatel vyplnil a znovu je zobrazíš

return View(ten tvůj RegisterViewModel)
Nahoru Odpovědět
8.3.2018 11:11
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Adam Gajdečka:8.3.2018 12:42

No to já chápu, jak to funguje. Ale takto to vrátit nemůžu protože neexistuje odpovídající view k RegisterToProgram. A specifikovat ten view nemůžu protože tam mi nebude sedět URL adresa

Register formulář i login je na stránce LoginToProgram

 
Nahoru Odpovědět
8.3.2018 12:42
Avatar
Adam Gajdečka:8.3.2018 12:44

A mi ten partial view vyrendruje ajax, jinak je tam viewModel, který obsahuje i další prvky

 
Nahoru Odpovědět
8.3.2018 12:44
Avatar
Odpovídá na Adam Gajdečka
Michal Štěpánek:8.3.2018 15:26

A jakou akcí zobrazuješ registraci?
P.S. používej tlačítko odpovědět

Editováno 8.3.2018 15:27
Nahoru Odpovědět
8.3.2018 15:26
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Adam Gajdečka:8.3.2018 20:48

Pomocí

<script>

    var data;
    $.ajax({
        type: "GET",
        url: "/Account/RegisterPartialView",
        contentType: "application/html; charset=utf-8",
        dataType: 'html',
        success: function (response) {
            data = response;
        }
    });

    function showRegisterView() {
        data = $("#loginArea")[0].innerHTML = data;
    }
</script>
 
Nahoru Odpovědět
8.3.2018 20:48
Avatar
Odpovídá na Michal Štěpánek
Adam Gajdečka:8.3.2018 20:53

LoginToProgram­.cshtml

@model Affiliate_Dashboard.ModelView.ProgramAboutModelView
@using PagedList.Mvc;

@{
    ViewBag.Title = Model.ProgramName;
    Layout = null;
}
@using Microsoft.AspNet.Identity;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="shortcut icon" href="~/Content/images/Logo/icons/favicon.ico">
    <title>@ViewBag.Title - Affiliate Features</title>
    <!-- Bootstrap core CSS -->
    <link href="~/Content/Theme/Velonic/Admin4/css/bootstrap.min.css" rel="stylesheet">
    <link href="~/Content/Theme/Velonic/Admin4/css/bootstrap-reset.css" rel="stylesheet">
    <meta property="og:image" content="https://affiliatefeatures.com/Content/images/preview.png" />
    <!--Animation css-->
    <link href="~/Content/Theme/Velonic/Admin4/css/animate.css" rel="stylesheet">

    @if (Model.SmartSuppKey != string.Empty && Model.SmartSuppKey != null)
    {
        <!-- Smartsupp Live Chat script -->
        <script type="text/javascript">
            var _smartsupp = _smartsupp || {};
            _smartsupp.key = '@Model.SmartSuppKey';
            window.smartsupp || (function (d) {
                var s, c, o = smartsupp = function () { o._.push(arguments) }; o._ = [];
                s = d.getElementsByTagName('script')[0]; c = d.createElement('script');
                c.type = 'text/javascript'; c.charset = 'utf-8'; c.async = true;
                c.src = 'https://www.smartsuppchat.com/loader.js?'; s.parentNode.insertBefore(c, s);
            })(document);
        </script>
    }



    <script src="~/Content/Theme/Velonic/Admin4/js/jquery.js"></script>

    <!--Icon-fonts css-->
    <link href="~/Content/Theme/Velonic/Admin4/assets/font-awesome/css/font-awesome.css" rel="stylesheet" />
    <link href="~/Content/Theme/Velonic/Admin4/assets/ionicon/css/ionicons.min.css" rel="stylesheet" />
    <link href="~/Content/Theme/Velonic/Admin4/assets/material-design-iconic-font/css/material-design-iconic-font.min.css" rel="stylesheet" />

    <!-- Custom styles for this template -->
    <link href="~/Content/Theme/Velonic/Admin4/css/style.css" rel="stylesheet">
    <link href="~/Content/Theme/Velonic/Admin4/css/helper.css" rel="stylesheet">
</head>
<body>
    <style>
        .container {
            padding-top: 5%;
        }
    </style>
    <div class="container">
        <div class="row">
            <div class="col-md-4">
                <div class="panel panel-color panel-inverse">
                    <div class="panel-heading">
                        <center>
                            <a href="/"><img src="/Content/images/Logo/logo/male/mini.png"></a><br>
                        </center>
                    </div>
                    <div class="panel-body" id="loginArea">
                        @Html.Partial("LoginPartialView")
                    </div>
                </div>
            </div>
            <div class="col-md-8">
                <div class="panel panel-color panel-inverse">
                    <div class="panel-heading">
                        <h3 class="panel-title">Affiliate Program - @Model.ProgramName</h3>
                        <div class="right">
                        </div>
                    </div>
                    <div class="panel-body">
                        <center><img src="@Model.ProgramLogoLink" /></center>
                        <h4>@AffiliateFeaturesLibrary.Resources.Lang.Basic.Description</h4>
                        @Html.Raw(@Model.ProgramDescription)
                        <hr />
                        <br />
                        <div class="col-md-3">
                            <img style="margin:20px;" src="@Model.ManagerPhotoLink" width="100" />
                            <br />
                        </div>

                        <div class="col-md-5">
                            <h4>@AffiliateFeaturesLibrary.Resources.Lang.Basic.AffiliateManager</h4>
                            <ul style="list-style:none;">
                                <li>@Model.ManagerName</li>
                                <li>@Model.ManagerEmail</li>
                                <li>@Model.ManagerPhone</li>
                            </ul>
                        </div>

                        <br />
                        @if (Model.campaignsIPL.Count() > 0)
            {
                <table class="table">
                    <tr>
                        <th>
                            @AffiliateFeaturesLibrary.Resources.Lang.Basic.Campaigns
                        </th>
                        <th>@AffiliateFeaturesLibrary.Resources.Lang.Basic.Commission</th>

                        <th>Cookies</th>
                        <th>@AffiliateFeaturesLibrary.Resources.Lang.Basic.UrlProduct</th>
                    </tr>
                    @foreach (var item in Model.campaignsIPL)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Name)
                </td>
                <td>
                    @item.CommissionLabel
                </td>
                <td>
                    @item.Cookies @AffiliateFeaturesLibrary.Resources.Lang.Basic.Days
                </td>
                <td><a target="_blank" href="@item.WebProduct">@item.WebProduct</a></td>
            </tr>
}
                </table>
}
                        <br />
                        @if (Model.campaignsIPL.PageCount > 1)
            {
                @Html.PagedListPager(Model.campaignsIPL, page => Url.Action("Program",
                        new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
}
                        <a target="_blank" href="@PublicLists.GetProgramTermsPath(Model.ProgramId)">@AffiliateFeaturesLibrary.Resources.Lang.Basic.TermsConditions</a>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <!-- js placed at the end of the document so the pages load faster -->
    <!--common script for all pages-->

</body>
</html>


<script>

    var data;
    $.ajax({
        type: "GET",
        url: "/Account/RegisterPartialView",
        contentType: "application/html; charset=utf-8",
        dataType: 'html',
        success: function (response) {
            data = response;
        }
    });

    function showRegisterView() {
        data = $("#loginArea")[0].innerHTML = data;
    }
</script>


<script>
    function postR() {
        var form = $('#main');
        $.ajax({
            cache: false,
            async: true,
            type: "POST",
            url: "/Account/RegisterToProgram",
            contentType: "application/json; charset=utf-8",
            data: {
                FirstName: $('#register_FirstName').val(),
                LastName: $('#register_LastName').val(),
            },
            success: function (response) {
                alert(response);
            }
        });
    }
</script>

RegisterPartialView

@model Affiliate_Dashboard.ModelView.ProgramAboutModelView
@using (Html.BeginForm("RegisterToProgram", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form", id = "main" }))
{
    @Html.AntiForgeryToken()

    @Html.ValidationSummary("", new { @class = "text-danger" })
    <div class="form-group">
        <div class="col-xs-12">
            @Html.TextBoxFor(m => m.register.FirstName, new { @class = "form-control", @placeholder = AffiliateFeaturesLibrary.Resources.Lang.Basic.FirstName })
        </div>
    </div>
    <div class="form-group">
        <div class="col-xs-12">
            @Html.TextBoxFor(m => m.register.LastName, new { @class = "form-control", @placeholder = AffiliateFeaturesLibrary.Resources.Lang.Basic.LastName })
        </div>
    </div>
    <div class="form-group">
        <div class="col-xs-12">
            @Html.TextBoxFor(m => m.register.Email, new { @class = "form-control", @placeholder = "Email" })
        </div>
    </div>
    <div class="form-group">
        <div class="col-xs-12">
            @Html.PasswordFor(m => m.register.Password, new { @class = "form-control", @placeholder = AffiliateFeaturesLibrary.Resources.Lang.Basic.Password })
        </div>
    </div>
    <div class="form-group">
        <div class="col-xs-12">
            @Html.PasswordFor(m => m.register.ConfirmPassword, new { @class = "form-control", @placeholder = AffiliateFeaturesLibrary.Resources.Lang.Basic.ConfirmationPassword })
        </div>
    </div>

    <div class="form-group">
        <div class="col-xs-12">
            @Html.TextBoxFor(m => m.register.Street, new { @class = "form-control", @placeholder = AffiliateFeaturesLibrary.Resources.Lang.Basic.Street })
        </div>
    </div>

    <div class="form-group">
        <div class="col-xs-12">
            @Html.TextBoxFor(m => m.register.City, new { @class = "form-control", @placeholder = AffiliateFeaturesLibrary.Resources.Lang.Basic.City })
        </div>
    </div>

    <div class="form-group">
        <div class="col-xs-12">
            @Html.TextBoxFor(m => m.register.ZIP, new { @class = "form-control", @placeholder = AffiliateFeaturesLibrary.Resources.Lang.Basic.ZIP })
        </div>
    </div>

    <div class="form-group">
        <div class="col-xs-12">
            @Html.TextBoxFor(m => m.register.IC, new { @class = "form-control", @placeholder = AffiliateFeaturesLibrary.Resources.Lang.Basic.IC })
        </div>
    </div>

    <div class="form-group">
        <div class="col-xs-12">
            @Html.TextBoxFor(m => m.register.VAT, new { @class = "form-control", @placeholder = AffiliateFeaturesLibrary.Resources.Lang.Basic.VAT })
        </div>
    </div>

    <div class="form-group">
        <div class="col-xs-12">
            <select required name="LanguageId" class="form-control">
                <option disabled selected>@AffiliateFeaturesLibrary.Resources.Lang.Basic.Choose</option>
                @foreach (var item in Model.register.languageList)
                {
                    if (2 == item.Id)
                    {
                        <option selected value="@item.Id">@item.Name</option>
                    }
                    else
                    {
                        <option value="@item.Id">@item.Name</option>
                    }
                }
            </select>
        </div>
    </div>

    <div class="form-group">
        <div class="col-xs-12">
            <select required name="LanguageId" class="form-control">
                <option disabled selected>@AffiliateFeaturesLibrary.Resources.Lang.Basic.Country</option>
                @foreach (var item in Model.CountryList)
                {
                    if (1 == item.Id)
                    {
                        <option selected value="@item.Id">@item.Name</option>
                    }
                    else
                    {
                        <option value="@item.Id">@item.Name</option>
                    }
                }
            </select>
        </div>
    </div>

    <style>
        label {
            display: block !important;
            padding-left: 15px !important;
            text-indent: -15px !important;
        }

        input[type=checkbox] {
            width: 13px !important;
            height: 13px !important;
            padding: 0 !important;
            margin: 0 !important;
            vertical-align: bottom !important;
            position: relative !important;
            top: -1px !important;
            *overflow: hidden !important;
        }
    </style>
    <div class="form-group">
        <label><input type="checkbox" required /><a style="margin-left:9px;" href="@PublicLists.GetProgramTermsPath(Model.ProgramId)">Souhlasím s obchodními podmínkami</a></label>
    </div>

    <div class="form-group">
        <label><input type="checkbox" required /><a style="margin-left:9px;" href="~/Content/Documents/vop-aplikace.pdf">Souhlasím s podmínkami aplikace</a></label>
    </div>

    <div class="form-group text-right">
        <div class="col-xs-12">
            <button class="btn btn-success w-md" id="fbEvent" type="submit">@AffiliateFeaturesLibrary.Resources.Lang.Basic.Register</button>
        </div>
    </div>

    <a onclick="postR()">sadsd</a>
}
<div class="form-group m-t-30">
    <div class="col-sm-7">
        <a href="@Url.Action("ForgotPassword")"><i class="fa fa-lock m-r-5"></i>@AffiliateFeaturesLibrary.Resources.Lang.Basic.ForgotYourPassword</a>
    </div>
    <div class="col-sm-5 text-right">
        <a href="@Url.Action("Login")">@AffiliateFeaturesLibrary.Resources.Lang.Basic.Login</a>
    </div>
</div>
 
Nahoru Odpovědět
8.3.2018 20:53
Avatar
Adam Gajdečka:10.3.2018 19:39

Nakonec jsem to vyřešil pomocí první možnosti http://www.binaryintellect.net/…a862778.aspx

Asi to není nejoptimálnější, ale funkci to plní dobře.

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
10.3.2018 19:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 19 zpráv z 19.