Controller :
public ActionResult MyController()
{
ViewBag.DateNow = DateTime.Now.ToString("yyyy-MM-dd");
}
[HTTPPost]
public ActionResult MyController(string fromDate)
{
ViewBag.DateNow = fromDate;
}
查看:
@using (Html.BeginForm("MyController", "Account", FormMethod.Post))
{
//datepicker class: bootstrap-datepicker.js
<input id="fromDate" type="text" class="datepicker" />
<buttontype="submit" value="Search" class="btn btn btn-primary">
Search
</button>
}
我想要实现的是在 POST 之前传递到 ViewBag.DateNow 的数据是当前日期,并且它成功地引入到 View 中。但是,当我尝试填写输入表单(例如:2016-05-10)并单击“搜索”按钮时。但似乎 fromDate 字符串返回 NullReferenceException 。我正在网上尝试一些解决方案,但仍然无法正确解决,这就是我决定将其发布的原因。提前致谢!
最佳答案
要使其正常工作,您需要在文本框
中指定name
属性。它需要与 HTTP post
操作方法中的输入变量(即 fromDate
)具有相同的值。当前 id
属性设置为 fromDate
:
<input id="fromDate" name="fromDate" type="text" value="@ViewBag.DateNow" />
如果您不指定此 name
属性,那么当您发布表单时,fromDate
将始终为 null
。像上面那样指定它将确保 fromDate
始终有一个值(如果输入)。
我想在这里说点题外话,我想建议您使用 View 模型
来提交表单。您可以将 View 模型作为输入参数,而不是在操作方法中使用单独的输入变量。
我在这里写了一个关于什么是 View 模型的答案,如果有时间请去阅读:
在您的示例中,我将拥有一个仅包含一个属性的 View 模型,即 FromDate
。 FromDate
将包含文本框中的值。它被设置为字符串
,因为您想向其传递格式化的日期值:
public class TestModel
{
public string FromDate { get; set; }
}
此值将在您的 HTTP get
操作方法中设置, View 模型将发送到 View :
public ActionResult Index()
{
TestModel model = new TestModel();
model.FromDate = DateTime.Now.ToString("yyyy-MM-dd");
return View(model);
}
在您看来,您将接受此 View 模型并相应地创建表单:
@model WebApplication_Test.Models.TestModel
@using (Html.BeginForm())
{
@Html.TextBoxFor(m => m.FromDate)
<button type="submit">Search</button>
}
当您提交此表单时,您需要一个 HTTP post
操作方法来处理提交。因为 View 绑定(bind)到 View 模型,所以操作方法将接受它作为输入参数:
[HttpPost]
public ActionResult Index(TestModel model)
{
// Do what you need to do
string date = model.FromDate;
return View(model);
}
你的做法也是正确的。我刚刚向您展示了另一种方法。有一天,您可能会拥有一个包含许多输入值的巨大表单,那么我的方法将变得“更干净”。
关于asp.net-mvc - MVC HTTP Post 输入返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37128094/