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.
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
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.
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.
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?
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.
Je to celé moc komplikované. Kam mám posílat ty POST akce a kudy vracet s flashMessages a temp data?
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...
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í
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?
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?
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)
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
A mi ten partial view vyrendruje ajax, jinak je tam viewModel, který obsahuje i další prvky
Michal Štěpánek:8.3.2018 15:26
A jakou akcí zobrazuješ registraci?
P.S. používej tlačítko odpovědět
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>
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>
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.
+5 Zkušeností
Zobrazeno 19 zpráv z 19.