Как я должен получить ввод формы и отправить этот ввод в класс C #?ASP.Net Core - бритвенные страницы - PullRequest
0 голосов
/ 24 марта 2019

Я кодирую базовую страницу портфолио в ASP.NET Core Razor Pages.Я хочу иметь контактную форму внизу, но я не могу получить поля ввода в текстовом поле для моего класса C # OnPostSendEmail ().

Я следовал Этот учебник , чтобына самом деле отправить письмо.Но мне не нужно ничего отправлять, потому что я не могу пройти через мой ввод в класс C #.Между прочим, пожалуйста, не просто говорите «Используйте Ajax» и т. Д.

Вот мой код .cshtml.cs:

namespace Portfolio.Pages
{
    public class IndexModel : PageModel
    {
        public void OnGet()
        {

        }
        public EmailConfig emailConfig = new EmailConfig();
        public ActionResult OnPostSendEmail(string fromAddr, string subject, string body, string phone, string firstName, string LastName)
        {
            SmtpClient client = new SmtpClient("smtp.gmail.com");
            client.UseDefaultCredentials = false;
            client.Credentials = new System.Net.NetworkCredential("Email", "Password");

            MailMessage mailMessage = new MailMessage();
            mailMessage.From = new MailAddress(emailConfig.FromAddr);
            mailMessage.To.Add("ToEmail");
            mailMessage.Body = emailConfig.Body + emailConfig.Phone;
            string tempEmailSub = emailConfig.Subject.ToString();
            tempEmailSub += (", ", emailConfig.Name.ToString());
            tempEmailSub += (", ", emailConfig.LastName.ToString());
            emailConfig.Subject = tempEmailSub;
            mailMessage.Subject = emailConfig.Subject;
            client.Send(mailMessage);
            return null;
        }




    }
    public class EmailConfig
    {
        public string FromAddr { get; set; }
        //public string ToAddr { get; set; }
        public string Body { get; set; }
        public string Subject { get; set; }
        public string Phone { get; set; }
        public string Name { get; set; }
        public string LastName { get; set; }
    }
}

Вот моя HTML-форма:

<form asp-page-handler="sendemail" id="contact-form" method="post" action="">
                    <div class="messages"></div>
                    <div class="controls">
                        <div class="row">
                            <div class="col-md-6">
                                <input asp-for="emailConfig.Name" id="Name" type="text" name="name" placeholder="Your firstname *" required="required" class="form-control">
                            </div>
                            <div class="col-md-6">
                                <input asp-for="emailConfig.LastName" id="LastName" type="text" name="surname" placeholder="Your lastname *" required="required" class="form-control">
                            </div>
                            <div class="col-md-6">
                                <input asp-for="emailConfig.FromAddr" id="FromAddr" type="text" name="email" placeholder="Your email *" required="required" class="form-control">
                            </div>
                            <div class="col-md-6">
                                <input asp-for="emailConfig.Phone" id="Phone"type="text" name="phone" placeholder="Your phone" class="form-control">
                            </div>
                            <div class="col-md-12">
                                <textarea asp-for="emailConfig.Body" id="Message" type="text" name="message" placeholder="Message for me *" rows="4" required="required" class="form-control"></textarea>
                            </div>
                            <div class="col-md-12 text-center">

                                <button type="submit" asp-route-data="HttpPostAttribute" asp-page-handler="SendEmail" class="btn btn-outline-primary">Send message</button>

                            </div>
                        </div>
                    </div>
                </form>

И мой JavaScript / Ajax

$(function () {

         $("#btn").click(function(e) {
             e.preventDefault();
             var t = '@GetAntiXsrfRequestToken()';
             $.ajax({

                      url: $(this).attr("formaction"),
                      headers:
                      {
                          "RequestVerificationToken": t
                      },
                      type: "POST",
                 data: {
                     FromAddr: $("#CommentText").val(),
                     Phone: $("#Phone").val(),
                     Subject: $("#Subject").val(),
                     Message: $("#Message").val(),
                     FirstName: $("#FirstName").val(),
                     LastName: $("#LastName").val()
                 },

             }).done(function(data) {
                     console.log(data);
             }).fail(function(a, v, e) {
                     alert(e);
             });
         });
    })

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Для простоты вы можете отправить информацию с клиента на сервер с привязкой Razor Model.

Для Razor Model Binding вам необходимо использовать [BindProperty].

Вот рабочая демонстрация:

IndexModel

public class IndexModel : PageModel
{
    public void OnGet()
    {

    }
    [BindProperty]
    public EmailConfig emailConfig { get; set; }
    public ActionResult OnPostSendEmail()
    {
        var email = emailConfig;
        return null;
    }
    public class EmailConfig
    {
        public string FromAddr { get; set; }
        //public string ToAddr { get; set; }
        public string Body { get; set; }
        public string Subject { get; set; }
        public string Phone { get; set; }
        public string Name { get; set; }
        public string LastName { get; set; }
    }
}

Для страницы бритвы клиента не нужно указывать id="Name" type="text" name="name", и вы не должны добавлять action="" при использовании asp-page-handler="sendemail"

<form asp-page-handler="sendemail" id="contact-form" method="post">
    <div class="messages"></div>
    <div class="controls">
        <div class="row">
            <div class="col-md-6">
                <input asp-for="emailConfig.Name" placeholder="Your firstname *" required="required" class="form-control">
            </div>
            <div class="col-md-6">
                <input asp-for="emailConfig.LastName" placeholder="Your lastname *" required="required" class="form-control">
            </div>
            <div class="col-md-6">
                <input asp-for="emailConfig.FromAddr" placeholder="Your email *" required="required" class="form-control">
            </div>
            <div class="col-md-6">
                <input asp-for="emailConfig.Phone" placeholder="Your phone" class="form-control">
            </div>
            <div class="col-md-12">
                <textarea asp-for="emailConfig.Body" placeholder="Message for me *" rows="4" required="required" class="form-control"></textarea>
            </div>
            <div class="col-md-12 text-center">
                <button type="submit" asp-route-data="HttpPostAttribute" asp-page-handler="SendEmail" class="btn btn-outline-primary">Send message</button>
            </div>
        </div>
    </div>
</form>
0 голосов
/ 24 марта 2019

Я думаю, что имя вашего входного параметра отличается от того, что вы публикуете в ajax-коде OnPostSendEmail (строка fromAddr , строка subject , строка body , строка телефон , строка firstName , строка LastName )

, и это часть данных кода ajax:

     data: {
                 **FromAddr**: $("#CommentText").val(),
                 **Phone**: $("#Phone").val(),
                 **Subject**: $("#Subject").val(),
                 **Message**: $("#Message").val(),
                 **FirstName**: $("#FirstName").val(),
                 **LastName**: $("#LastName").val()
             },

Параметры данных Ajaxимя должно совпадать с кодом C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...