Модель не привязывается из частичного представления _Footer.cshtml на странице _Layout.cshtml на страницах razor

#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, я рад, что мой ответ может вам немного помочь. Спасибо, что поделились своим точным решением.