首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC2 DisplayFormat属性在PostBack之后不起作用

MVC2 DisplayFormat属性在PostBack之后不起作用
EN

Stack Overflow用户
提问于 2010-11-29 22:09:50
回答 1查看 2.2K关注 0票数 1

我有一个具有属性的ViewModel,如下所示:

代码语言:javascript
复制
    [DisplayName("As Configured On:")]
    [DisplayFormat(DataFormatString="{0:d}", ApplyFormatInEditMode=true)]
    public DateTime ConfigDate { get; set; }

显示ConfigDate的表单如下所示:

代码语言:javascript
复制
<%= Html.EditorFor(Model => Model.ConfigDate)%>

当Index返回时,所有内容看起来都格式正确,即<input>框的日期值为12/12/2001。当表单发布时,返回的结果就好像没有应用DisplayFormat属性一样。

编辑:要求提供更多信息:下面是代码

搜索表单

代码语言:javascript
复制
<%@ 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

代码语言:javascript
复制
    public class AirplanesViewModel
{
    [DisplayName("As Configured On:")]
    [DisplayFormat(DataFormatString="{0:d}", ApplyFormatInEditMode=true)]
    public DateTime ConfigDate { get; set; }
}
}

控制器

代码语言:javascript
复制
        [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(并且引起了恼人的“您确定吗?”刷新时弹出)。奇怪的是,唯一的问题是该领域的格式丢失。其他一切都很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-29 22:17:54

在等待您明确说明问题时,这里有一个完整的反示例,您在问题中所描述的情况并没有实际发生:

型号:

代码语言:javascript
复制
public class MyViewModel
{
    [DisplayName("As Configured On:")]
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
    public DateTime ConfigDate { get; set; }
}

主计长:

代码语言:javascript
复制
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);
    }
}

查看:

代码语言:javascript
复制
<% using (Html.BeginForm()) { %>
    <%= Html.EditorFor(x => x.ConfigDate) %>
    <input type="submit" value="OK" />
<% } %>

您可以尽可能多地提交表单,格式将保留下来。

更新:

在提供了更多信息之后,这里是问题发生的原因。当您用Details重定向到return RedirectToAction("Details", avm);操作时,查询字符串参数将应用于url:

代码语言:javascript
复制
http://localhost:1114/Airplanes/Details?ConfigDate=11/30/2010%2000:00:00

注意时间是如何包括在内的,这是正常的。现在,当您返回Details GET操作中的视图时,负责生成编辑器模板的helper将执行以下任务:

检查是否有ConfigDate参数( GET或POST)。如果没有找到,请检查传递给视图的模型的值,并使用模型的ConfigValue属性并生成textbox。

由于在查询字符串中找到了一个ConfigValue,所以根本不使用模型。因此,它只是接受在重定向中传递的值,该值还包含时间,并使用它绑定到它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4308584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档