提交按钮不会从文本框传递输入

时间:2017-02-15 23:40:25

标签: asp.net-mvc

基本上我有一个输入框,用户可以输入他的电子邮件,以及提交电子邮件的按钮。我可以按下按钮,然后重定向到我的"详细信息"页。但是,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个属性。

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 = ".."元素