基本上我有一个输入框,用户可以输入他的电子邮件,以及提交电子邮件的按钮。我可以按下按钮,然后重定向到我的"详细信息"页。但是,texbox的输入不会传递给我的控制器。
查看:
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
<div class="form-group form-inline">
<label class="margin20">Sign up for newsletter</label>
@Html.TextBoxFor(Model => Model.Email, new { name= "mail", Class = "form-control", Style = "display:inline-block; max-width:200px", Placeholder="Example@Example.com" })
<input type="submit" class="btn btn-default" style="display:inline-block" id="emailSignup"/>
</div>
}
控制器
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(string mail)
{
return RedirectToAction("details", new {address = mail });
}
public ActionResult details(string address)
{
EmailSignup person = new EmailSignup { Email = address};
return View(person);
}
}
我离开了模型,因为它基本上是1个属性。
答案 0 :(得分:0)
您
@Html.TextBoxFor(Model => Model.Email, ...)
正在使用name="Email"
生成输入。
请注意,new { name = "mail" }
绝对没有什么是幸运的(看看你的生成的html),因为如果它确实,它会搞砸模型绑定过程 - 使用HtmlHelper
方法的整个目的是绑定到你的模型。
您可以将方法更改为
[HttpPost]
public ActionResult Index(string email)
并且参数将被正确绑定,但您的方法应该是
[HttpPost]
public ActionResult Index(XXX model)
{
if (!ModelState.IsValid)
{
return View(model);
}
return RedirectToAction("details", new { address = model.Email });
}
其中XXX
是您在视图中声明的模型(即使用@model XXX
),以便您获得正确的模型绑定并可以考虑验证。
另请注意,您的属性应为
[Display(Name = "Sign up for newsletter")]
[Required("Please ...")] // assuming you want to ensure a value is submitted
[EmailAddress] // assuming you want a valid email
public string Email { get; set; }
然后视图将是
@Html.LabelFor(m => m.Email) / correctly generates a label associated with the input
@Html.TextBoxFor(m => m.Email, new { @class = "form-control", placeholder="Example@Example.com" })
@Html.ValidationMessageFOr(m => m.Email)
我建议添加另一个类名并使用css而不是内联style = ".."
元素