#c# #asp.net-mvc #asp.net-core #razor #razor-pages
Вопрос:
Я хочу реализовать функцию подписки на рассылку новостей в нижнем колонтитуле своей веб-страницы.
Расширенная подписка должна быть видна на всех страницах. По этой причине я включил его как частичное представление в свой _Layout.
_Layout.cshtml
Файл является:
lt;body id="top-header"gt; lt;!-- preloader start --gt; lt;div class="preloader"gt; lt;div class="spin"gt;lt;/divgt; lt;/divgt; lt;!-- preloader end --gt; lt;!-- Header Start --gt; @await Html.PartialAsync("_Header") lt;!-- Header Close --gt; @RenderBody() lt;!-- Footer Start --gt; lt;partial name="_Footer" model="new SubscribeNewsletterPageModel()" /gt; lt;!-- Footer Close --gt; lt;!-- Page Scroll to Top --gt; lt;a class="scroll-to-top js-scroll-trigger" href="#top-header"gt; lt;i class="fa fa-angle-up"gt;lt;/igt; lt;/agt; lt;!-- Page Scroll to Top --gt; lt;script src="~/lib/jquery/dist/jquery.min.js"gt;lt;/scriptgt; lt;script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"gt;lt;/scriptgt; lt;script src="~/js/site.min.js" asp-append-version="true"gt;lt;/scriptgt; lt;!-- Main Script --gt; lt;script src="~/js/script.min.js"gt;lt;/scriptgt; @await RenderSectionAsync("Scripts", required: false) lt;/bodygt;
Я создал SubscribeNewsletterPageModel.cs
класс, содержащий модель, которую я хочу использовать для публикации адреса электронной почты подписчика:
public class SubscribeNewsletterPageModel : PageModel { [BindProperty] public Newsletter newsletter { get; set; } public async Tasklt;IActionResultgt; OnPostSubscribeNewsletter() { TempData["returnurl"] = Request.Headers["Referer"].ToString(); var apiKey = "xxxxx"; string bearer = "Bearer " apiKey; string newsletterForJSON = newsletter.EMail; // queryParams added only for testing // in production newsletterForJSON must be used string queryParams = @"{ 'contacts': [ { 'email': 'firstname.lastname@gmail.com', } ] }"; JObject queryParamsJSON = JObject.Parse(queryParams); var client = new RestClient("https://api.sendgrid.com/v3/marketing/contacts"); var request = new RestRequest(Method.PUT); request.AddHeader("content-type", "application/json"); request.AddHeader("authorization", bearer); request.AddParameter("application/json", queryParamsJSON, ParameterType.RequestBody); IRestResponse response = await client.ExecuteAsync(request); var error = response.Content; return Redirect(TempData["returnurl"].ToString()); } }
On my _Footer.cshtml
, which is a Razor View, I start with my model:
@model SubscribeNewsletterPageModel
Then I have my form:
lt;form asp-page-handler="SubscribeNewsletter" method="post"gt; lt;div class="position-relative"gt; lt;input asp-for="@Model.newsletter.EMail" class="form-control border-0 text-white newsletter-form" id="newsletter" name="newsletter" placeholder="Geben Sie Ihre E-Mail ein"gt; lt;button type="submit" class="btn btn-primary btn-subscribe"gt;Registerlt;/buttongt; lt;/divgt; lt;/formgt;
Для моей страницы Index Razor, которую я унаследовал от SubscribeNewsletterPageModel
public class IndexModel : SubscribeNewsletterPageModel
Если я начну отладку (F5) и установлю точку останова в своем OnPostSubscribeNewsletter
методе, я увижу, что мое свойство привязки ПУСТО!
Есть идеи?
Ответ №1:
Если я начну отладку (F5) и установлю точку останова в своем методе OnPostSubscribeNewsletter, я увижу, что мое свойство привязки ПУСТО!
Вы имеете в виду, что электронное письмо не было успешно привязано?
В файле _Footer.cshtml вы можете попытаться изменить имя=»информационный бюллетень» на имя=»информационный бюллетень».Электронная почта» Измените код ниже
lt;input asp-for="@Model.newsletter.EMail" class="form-control border-0 text-white newsletter-form" id="newsletter" name="newsletter" placeholder="Geben Sie Ihre E-Mail ein"gt;
В
lt;input asp-for="@Model.newsletter.EMail" class="form-control border-0 text-white newsletter-form" id="newsletter" name="newsletter.Email" placeholder="Geben Sie Ihre E-Mail ein"gt;
Результат:
Комментарии:
1. Привет, Цин Го, да, ты прав. Я также видел, что хейвиг установил
asp-for="@Model.newsletter.EMail"
, что на самом деле нет необходимости указыватьname="newsletter.Email"
. Помощник по тегамasp-for
уже отвечает за привязку. В моем кодеname="newsletter"
это порождало проблему и какой-то конфликт с помощником по тегам. Большое спасибо за вашу помощь.2. Привет, Code4Fun, я рад, что мой ответ может вам немного помочь. Спасибо, что поделились своим точным решением.