PostBack后MVC2 DisplayFormat属性不起作用

时间:2010-11-29 22:09:51

标签: asp.net-mvc-2 attributes

我有一个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(并导致烦人的“你确定吗?“弹出刷新)。奇怪的是,唯一的问题是该字段中的格式丢失。其他一切都很好。

1 个答案:

答案 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,因此根本不使用该模型。所以它只需要在重定向中传递的值,它也包含时间并使用它来绑定它。