将表单提交给MVC

时间:2012-01-18 21:33:06

标签: asp.net asp.net-mvc forms

我的表单代码没有生成正确的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 个答案:

答案 0 :(得分:1)

将您的<form>声明更改为:

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

<!-- Form data -->

<% } %>

其中[Controller]是控制器的名称减去“控制器”。换句话说,如果控制器名称为HomeController,则使用“Home”。

答案 1 :(得分:0)

您需要向表单添加操作

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

但实际上这应该使用MVC3 BeginForm帮助程序来完成。

您需要让控制器呈现您的HTML。因此,将您的HTML放在名为“SendEmail”的视图中,并使用[HttpGet]属性编写控制器操作。 调用Action“SendEmail”并在其中执行return View()

喜欢这个

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

这将导致BeginForm正确呈现action =“”。

然后,一旦它正在工作,当你发回数据时你会遇到问题,因为输入字段没有绑定到你的模型。您需要将@model yournamespace.EmailData添加到视图的顶部,然后需要更改输入以绑定到模型属性。

我不知道这个链接有多好,但它是我发现的第一个看起来可能会引导您完成类似过程的链接http://geekswithblogs.net/WinAZ/archive/2010/10/30/an-mvc-3-contact-form.aspx

答案 2 :(得分:0)

尝试将视图中的表单声明更改为此(使用Razor语法):

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

using语句将确保您的表单正确关闭。

此外,HtmlHelper.BeginForm扩展方法足够灵活,可以根据应用程序RouteCollection中定义的路由生成操作的URI,这样如果您的路由发生更改,则表单不需要更新;优化并自动处理URI的更改。