我有一个具有属性的ViewModel,如下所示:
[DisplayName("As Configured On:")]
[DisplayFormat(DataFormatString="{0:d}", ApplyFormatInEditMode=true)]
public DateTime ConfigDate { get; set; }显示ConfigDate的表单如下所示:
<%= Html.EditorFor(Model => Model.ConfigDate)%>当Index返回时,所有内容看起来都格式正确,即<input>框的日期值为12/12/2001。当表单发布时,返回的结果就好像没有应用DisplayFormat属性一样。
编辑:要求提供更多信息:下面是代码
搜索表单
<%@ 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(并且引起了恼人的“您确定吗?”刷新时弹出)。奇怪的是,唯一的问题是该领域的格式丢失。其他一切都很好。
发布于 2010-11-29 22:17:54
在等待您明确说明问题时,这里有一个完整的反示例,您在问题中所描述的情况并没有实际发生:
型号:
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);操作时,查询字符串参数将应用于url:
http://localhost:1114/Airplanes/Details?ConfigDate=11/30/2010%2000:00:00注意时间是如何包括在内的,这是正常的。现在,当您返回Details GET操作中的视图时,负责生成编辑器模板的helper将执行以下任务:
检查是否有ConfigDate参数( GET或POST)。如果没有找到,请检查传递给视图的模型的值,并使用模型的ConfigValue属性并生成textbox。
由于在查询字符串中找到了一个ConfigValue,所以根本不使用模型。因此,它只是接受在重定向中传递的值,该值还包含时间,并使用它绑定到它。
https://stackoverflow.com/questions/4308584
复制相似问题