Атрибут MVC2 DisplayFormat не работает после PostBack - PullRequest
1 голос
/ 30 ноября 2010

У меня есть 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 не применяется.

EDIT: Требуется дополнительная информация: вот код 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" />
<% } %>

Модель самолета

    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. Когда я вынимаю действие POST и удаляю атрибут GET (поэтому и GET, и POST используют действие Details ()), проблема исчезает - но это также избавляет от моих симпатичных URL-адресов при отправке формы (и вызывает раздражение » Вы уверены? »всплывающее окно при обновлении). Странно, единственная проблема - потеря форматирования в этой области. Все остальное в порядке.

1 Ответ

2 голосов
/ 30 ноября 2010

В ожидании, когда вы четко определите проблему, вот полный пример работы счетчика, который на самом деле не соответствует тому, что вы описываете в своем вопросе:

Модель:

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, помощник HTML, отвечающий за создание шаблона редактора, выполнит следующие задачи:

Проверьте, есть ли параметр ConfigDate (либо GET, либо POST).Если ничего не найдено, проверьте значение модели, которое передается представлению, и используйте свойство ConfigValue модели и сгенерируйте текстовое поле.

Поскольку в строке запроса найдено ConfigValue, модель не являетсяиспользуется на всех.Поэтому он просто берет значение, переданное в перенаправлении, которое также содержит время, и использует его для привязки к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...