我的表单代码没有生成正确的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>
为什么行动是空的任何想法?
答案 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的更改。