Отправка формы в MVC - PullRequest
       5

Отправка формы в MVC

0 голосов
/ 19 января 2012

Мой код формы не генерирует правильный HTML. Вот мой код.

Вот код формы:

@using (Html.BeginForm("SendEmail", "PropertyDetails", FormMethod.Post))
{
    <fieldset>
        <div class="left">
            <label for="Name">Your Name</label>
            <input type="text" required name="Name" />

            <label for="Phone">Your Phone Number</label>
            <input type="text" required name="Phone" />

            <label for="Email">Your Email</label>
            <input type="email" class="text" required name="Email" />
        </div>

        <div class="right">
            <label for="Message">Your Message</label>
            <textarea name="Message"> 
            </textarea>
            <input type="submit" name="submit" value="send" />
            <div class="clear"></div>
        </div>
        <div class="clear"></div>
    </fieldset>
}

Вот мой контроллер. У меня есть точка останова в первой строке сообщения SendMail, которая не была нажата:

public class PropertyDetailsController : Controller
{
    [HttpPost]
    public ActionResult SendEmail(EmailData email)
    {
        if (ModelState.IsValid) // BREAKPOINT ON THIS LINE ISN'T BEING HIT
        {

и т.д.

Вот класс, который должен быть заполнен данными формы и передан в метод (я сам этим не занимаюсь. Полагаю, это происходит автоматически под одеялом).

public class EmailData
{
    private string _name;
    private string _email;
    private string _phone;
    private string _message;

    [Required]
    [StringLength(50, MinimumLength = 1)]
    public string Name
    {
        get { return _name; }
        set { _name = value == null ? string.Empty : value.Trim(); }
    }

    [Required]
    [RegularExpression(RegEx.Email, ErrorMessage = "Invalid e-mail address.")]
    public string Email
    {
        get { return _email; }
        set { _email = value == null ? string.Empty : value.Trim(); }
    }

    public string Phone
    {
        get { return _phone; }
        set { _phone = value == null ? string.Empty : HtmlHelper.StripIllegalXmlChars(value.Trim()); }
    }

    [StringLength(500, MinimumLength = 1)]
    public string Message
    {
        get { return _message; }
        set { _message = value == null ? string.Empty : HtmlHelper.StripIllegalXmlChars(value.Trim()); }
    }
}

Вот генерируемый HTML-код:

<form action="" method="post">            
   <fieldset>
                <div class="left">
                    <label for="Name">Your Name</label>
                    <input type="text" required name="Name" />

                    <label for="Phone">Your Phone Number</label>
                    <input type="text" required name="Phone" />

                    <label for="Email">Your Email</label>
                    <input type="email" class="text" required name="Email" />
                </div>

                <div class="right">
                    <label for="Message">Your Message</label>
                    <textarea name="Message"> 
                    </textarea>
                    <input type="submit" name="submit" value="send" />
                    <div class="clear"></div>
                </div>
                <div class="clear"></div>
   </fieldset>
</form>

Есть идеи, почему акция пуста?

Ответы [ 3 ]

1 голос
/ 19 января 2012

Измените вашу <form> декларацию на:

<% using (Html.BeginForm("SendEmail", "[Controller]")) { %>

<!-- Form data -->

<% } %>

Где [Controller] - имя вашего контроллера за вычетом «Controller». Другими словами, если имя контроллера HomeController, вы должны использовать «Home».

0 голосов
/ 19 января 2012

Попробуйте изменить объявление формы в вашем представлении на это (используя синтаксис Razor):

@using (this.Html.BeginForm("SendEmail", "[your controller name]", FormMethod.Post))
{
  [form HTML]
}

Оператор использования гарантирует, что ваша форма закрыта правильно.

Также метод расширения HtmlHelper.BeginForm является достаточно гибким, так что он генерирует URI для действия на основе маршрутов, определенных в RouteCollection вашего приложения, так что если ваши маршруты изменяются, форму не нужно обновлять; изменение в URI обрабатывается изящно и автоматически.

0 голосов
/ 19 января 2012

Вам необходимо добавить действие в форму

<form action="/SendEmail/" method="post">

Но на самом деле это должно быть сделано с помощью помощника MVC3 BeginForm.

Вам нужно, чтобы ваш HTML отображался контроллером. Поэтому поместите ваш HTML в представление с именем «SendEmail» и напишите действие контроллера с атрибутом [HttpGet]. Вызовите действие «SendEmail» и просто выполните return View().

Как это

    [HttpGet]
    public ActionResult SendEmail()
    {
        return View();
    }

Это заставит BeginForm правильно отобразить action = "".

Тогда, когда это сработает, у вас возникнет проблема, когда вы отправите данные обратно, потому что поля ввода не привязаны к вашей модели. Вам нужно добавить @model yournamespace.EmailData в самый верх вашего View, а затем вам нужно изменить входные данные, чтобы привязать их к свойствам модели.

Понятия не имею, насколько хороша эта ссылка, но я обнаружил, что она первая, которая может провести вас через аналогичный процесс http://geekswithblogs.net/WinAZ/archive/2010/10/30/an-mvc-3-contact-form.aspx

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