2010-11-29 18 views
1

funktionierts habe ich ein Ansichtsmodell mit einer Eigenschaft wie folgt:MVC2 Displayformat Attribut nicht nach dem Postback

[DisplayName("As Configured On:")] 
    [DisplayFormat(DataFormatString="{0:d}", ApplyFormatInEditMode=true)] 
    public DateTime ConfigDate { get; set; } 

Das Formular, das die ConfigDate anzeigt, ist wie folgt:

<%= Html.EditorFor(Model => Model.ConfigDate)%> 

Wenn der Index Aktion kommt zurück, alles sieht korrekt formatiert aus, dh die <input> Box hat den Datumswert wie 12.12.2001. Wenn das Formular gebucht wird, ist das Ergebnis, das zurückkommt, als ob das DisplayFormat Attribut nicht angewendet wird.

EDIT: Weitere Informationen angefordert wurde: hier ist der Code en toto:

das Suchformular

<%@ 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" /> 
<% } %> 

Die AirplanesViewModel

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

The Controller

 [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); 
     } 
    } 

Weitere Informationen

Es hat etwas mit der Umleitung auf die GET-Aktion zu tun. Wenn ich die POST-Aktion herausnehme und das GET-Attribut entferne (so verwenden sowohl GET als auch POST die Details() -Aktion), verschwindet das Problem - aber das wird auch meine hübschen URLs los, wenn das Formular abgeschickt wird (und verursacht das lästige " Bist du sicher? "Popup bei Aktualisierung. Seltsamerweise ist das einzige Problem der Verlust der Formatierung in diesem Feld. Alles andere ist in Ordnung.

+0

Bitte zeigen Sie Controller-Aktionen (vorzugsweise sowohl GET und POST), Ihr gesamtes Modell und Ansicht, so dass das Problem eindeutig angegeben ist. Im Moment ist es nur ein bisschen raten hier und ich hasse es zu erraten. Ich bevorzuge es, Probleme zu lösen. –

Antwort

2

Während des Wartens auf Sie, das Problem offenbar angeben, hier ist ein voll funktionsGegenBeispiel das, was Sie in Ihrer Frage beschreiben eigentlich nicht passieren:

Modell:

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

Controller:

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); 
    } 
} 

Ausblick:

<% using (Html.BeginForm()) { %> 
    <%= Html.EditorFor(x => x.ConfigDate) %> 
    <input type="submit" value="OK" /> 
<% } %> 

Sie können das Formular so oft senden, wie Sie möchten, die Formatierung bleibt erhalten.


UPDATE:

Nach der Bereitstellung zusätzlicher Informationen ist hier, warum das Problem auftritt. Wenn Sie zu Details Aktion mit return RedirectToAction("Details", avm); eine Abfrage-String-Parameter Umleitung wird auf die URL angewendet:

http://localhost:1114/Airplanes/Details?ConfigDate=11/30/2010%2000:00:00 

Beachten Sie, wie die Stunde inbegriffen und das ist normal.Wenn Sie jetzt die Ansicht in der Aktion Details GET zurückgeben, führt der HTML-Helfer, der für die Generierung der Editorvorlage zuständig ist, folgende Aufgaben aus:

Überprüfen Sie, ob ein ConfigDate-Parameter vorhanden ist (entweder GET oder POST). Wenn keine gefunden wurde, überprüfen Sie den Wert des Modells, das an die Ansicht übergeben wird, und verwenden Sie die ConfigValue-Eigenschaft des Modells, und generieren Sie das Textfeld.

Da ein ConfigValue in der Abfragezeichenfolge gefunden wird, wird das Modell überhaupt nicht verwendet. Es nimmt also einfach den in der Weiterleitung übergebenen Wert, der auch die Zeit enthält, und verwendet sie, um an sie zu binden.

+0

Ja, das funktioniert - aber ich habe meine POST und GET in zwei Methoden aufgeteilt (wie Sie richtig vermutet) und irgendwo in der Formatierung verloren geht. –

+0

hmm ... das macht sehr viel Sinn. Es klingt für mich so, als müsste ich der Route Mapping für das ConfigDate einen Parameter hinzufügen, damit das ConfigDate nicht in der Querystring angezeigt wird, ja? –

Verwandte Themen