我有一个ViewModel,其属性如下:
[DisplayName("As Configured On:")]
[DisplayFormat(DataFormatString="{0:d}", ApplyFormatInEditMode=true)]
public DateTime ConfigDate { get; set; }
显示ConfigDate的表单如下:
<%= Html.EditorFor(Model => Model.ConfigDate)%>
当索引操作返回时,所有内容都看起来格式正确,即<input>
框的日期值为12/12/2001。发布表单时,返回的结果就好像未应用DisplayFormat
属性一样。
编辑: 请求了更多信息:这是代码 en toto :
搜索表单
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Config.Web.Models.AirplanesViewModel>" %>
<% using (Html.BeginForm("Details", "Airplanes", FormMethod.Post, new { id = "SearchForm" })) { %>
<%= Html.LabelFor(model => model.ConfigDate) %>
<%= Html.EditorFor(Model => Model.ConfigDate)%>
<input id="searchButton" type="submit" value="Search" />
<% } %>
AirplanesViewModel
public class AirplanesViewModel
{
[DisplayName("As Configured On:")]
[DisplayFormat(DataFormatString="{0:d}", ApplyFormatInEditMode=true)]
public DateTime ConfigDate { get; set; }
}
}
控制器
[HttpGet]
public ActionResult Index()
{
AirplanesViewModel avm = new AirplanesViewModel
{
ConfigDate = DateTime.Now
};
return View(avm);
}
[HttpPost]
[ActionName("Details")]
public ActionResult Details_Post(AirplanesViewModel avm)
{
return RedirectToAction("Details", avm);
}
[HttpGet]
public ActionResult Details(AirplanesViewModel avm)
{
int page = 0;
int pageSize = 10;
if (!ModelState.IsValid)
{
avm.Airplanes = new PaginatedList<Airplane>();
return View(avm);
}
try
{
Query q = new Query(avm.Query);
PaginatedList<Airplane> paginatedPlanes = new PaginatedList<Airplane>(repo.ByQuery(q), page, pageSize);
avm.Airplanes = paginatedPlanes;
return View(avm);
}
catch (Exception)
{
// Should log exception
avm.Airplanes = new PaginatedList<Airplane>();
return View(avm);
}
}
其他信息
它与重定向到GET Action有关。当我取出POST Action并删除GET属性时(因此GET和POST都使用Details()Action)问题就消失了 - 但是当提交表单时这也消除了我的漂亮URL(并导致烦人的“你确定吗?“弹出刷新)。奇怪的是,唯一的问题是该字段中的格式丢失。其他一切都很好。
答案 0 :(得分:2)
在等待您明确指出问题的同时,这是一个完整的工作反例,您在问题中描述的内容实际上并未发生:
型号:
public class MyViewModel
{
[DisplayName("As Configured On:")]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
public DateTime ConfigDate { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
ConfigDate = DateTime.Now
};
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
查看:
<% using (Html.BeginForm()) { %>
<%= Html.EditorFor(x => x.ConfigDate) %>
<input type="submit" value="OK" />
<% } %>
您可以根据需要提交表单,格式将被保留。
更新:
在此处提供其他信息之后,问题就出现了。当您使用Details
重定向到return RedirectToAction("Details", avm);
操作时,会将查询字符串参数应用于网址:
http://localhost:1114/Airplanes/Details?ConfigDate=11/30/2010%2000:00:00
注意小时是如何包含的,这是正常的。现在,当您在Details
GET操作中返回视图时,负责生成编辑器模板的HTML帮助程序将执行以下任务:
检查是否有ConfigDate参数(GET或POST)。如果没有找到,请检查传递给视图的Model的值,并使用模型的ConfigValue
属性并生成文本框。
由于在查询字符串中找到了ConfigValue,因此根本不使用该模型。所以它只需要在重定向中传递的值,它也包含时间并使用它来绑定它。