используя аннотацию HttpPost? Исправить так, чтобы не ломать страницу

1

Я создаю форму электронной почты MVC, и все, что есть на странице учебника, за исключением случаев, когда я сохраняю [HttpPost] разрыв страницы.

Я не думаю, что я отказываюсь от Импорта.

Что исправит это, так что форма электронной почты будет опубликована или, скорее, [HttpPost] не вызовет ошибку? Я также попробовал [System.Web.Mvc.HttpPost]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Net.Mail;
using System.Text;
using SW.Models;

namespace SW.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult About()
        {
            //ViewBag.Message = "Your application description page.";

            return View();
        }

        //[System.Web.Mvc.HttpPost]
        public ActionResult Contact(ContactModels c)
        {
            //ViewBag.Message = "Your contact page.";
            if (ModelState.IsValid)
            {
                try
                {
                    MailMessage msg = new MailMessage();
                    SmtpClient smtp = new SmtpClient();
                    MailAddress from = new MailAddress(c.Email.ToString());
                    StringBuilder sb = new StringBuilder();
                    msg.To.Add("[email protected]");
                    msg.Subject = "Contact Us";
                    msg.IsBodyHtml = false;
                    smtp.Host = "mail.mail.com";
                    smtp.Port = 25;
                    sb.Append("First name: " + c.FirstName);
                    sb.Append(Environment.NewLine);
                    sb.Append("Last name: " + c.LastName);
                    sb.Append(Environment.NewLine);
                    sb.Append("Email: " + c.Email);
                    sb.Append(Environment.NewLine);
                    sb.Append("Comments: " + c.Comment);
                    smtp.Send(msg);
                    msg.Dispose();
                    return View("Success");
                }
                catch (Exception)
                {
                    return View("Error");
                }
            }
            return View();
        }
    }
}

Как скоро, когда я получаю контакт, я получаю сообщение об ошибке:

Ошибка сервера в приложении '/'

Ресурс не может быть найден.

Описание: HTTP 404. Ресурс, который вы ищете (или его зависимости), мог быть удален, изменилось его имя или временно недоступно. Просмотрите следующий URL-адрес и убедитесь, что оно написано правильно.

Запрошенный URL:/Главная/Контакт

Информация о версии: Microsoft.NET Framework Версия: 4.0.30319; Версия ASP.NET: 4.0.30319.18446

  • 1
    какую ошибку вы получаете?
  • 0
    Проблема в том, что Contact должен работать как с POST и с GET ? Т.е. если вы добавите пост-аннотацию, получение страницы контакта больше не работает?
Теги:
http

3 ответа

3
Лучший ответ

Трудно сказать точно, не зная, какое сообщение об ошибке вы получаете, но я думаю, что это проблема: вы захотите иметь отдельные методы GET и POST для действия Contact(). GET обрабатывает случай, когда вы просматриваете страницу контакта. POST обрабатывает случай, когда вы отправляете свою форму.

Это может выглядеть примерно так:

    [System.Web.Mvc.HttpGet]
    public ActionResult Contact()
    {
        return View(new ContactModels());
    }

    [System.Web.Mvc.HttpPost]
    public ActionResult Contact(ContactModels c)
    {
        //ViewBag.Message = "Your contact page.";
        if (ModelState.IsValid)
        {
            try
            {
                MailMessage msg = new MailMessage();
                SmtpClient smtp = new SmtpClient();
                MailAddress from = new MailAddress(c.Email.ToString());
                StringBuilder sb = new StringBuilder();
                msg.To.Add("[email protected]");
                msg.Subject = "Contact Us";
                msg.IsBodyHtml = false;
                smtp.Host = "mail.mail.com";
                smtp.Port = 25;
                sb.Append("First name: " + c.FirstName);
                sb.Append(Environment.NewLine);
                sb.Append("Last name: " + c.LastName);
                sb.Append(Environment.NewLine);
                sb.Append("Email: " + c.Email);
                sb.Append(Environment.NewLine);
                sb.Append("Comments: " + c.Comment);
                smtp.Send(msg);
                msg.Dispose();
                return View("Success");
            }
            catch (Exception)
            {
                return View("Error");
            }
        }
        return View();
    }

Если у вас есть только один метод с атрибутом HttpPost, он доступен только для HTTP-запросов POST, поэтому попытка HTTP GET страницы в вашем веб-браузере завершится с ошибкой.

1

Действия без атрибутов - это методы GET по умолчанию. Если вы добавите явный атрибут HttpPost к вашему методу, он больше не будет работать для запросов GET, таких как отображение страницы контактов в первую очередь.

Вы можете использовать синтаксис атрибута [AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)] чтобы разрешить оба.

0

У вас должны быть как действия Get, так и Post, или удалить атрибут HttpPost и назначить ваш метод формы "GET".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню