35 Stimmen

Datum bei Bindung formatieren (ASP.NET MVC)

In meiner ASP.net MVC-Anwendung habe ich eine Ansicht, die wie folgt aussieht:

...
<label>Due Date</label>
<%=Html.TextBox("due")%>
...

Ich verwende eine ModelBinder um den Beitrag an mein Modell zu binden (die Eigenschaft due ist von DateTime Typ). Das Problem ist, wenn ich "01/01/2009" in das Textfeld eingebe und der Beitrag nicht validiert wird (weil andere Daten falsch eingegeben wurden). Das Bindemittel füllt es mit dem Datum wieder auf und Zeit "01/01/2009 00:00:00 ".

Gibt es eine Möglichkeit, dem Binder mitzuteilen, dass er das Datum korrekt formatieren soll (z. B. ToShortDateString() )?

0 Stimmen

Das habe ich gestern auch schon erlebt. Ich wünschte, sie hatten eine Überlastung, die Sie in einem Format-String übergeben lassen.

0 Stimmen

Ich denke, die hier vorgeschlagene Lösung ist sauberer: stackoverflow.com/questions/8089316/

3voto

Serhiy Punkte 4199

Fügen Sie zunächst diese Erweiterung hinzu, um den Eigenschaftspfad zu erhalten:

public static class ExpressionParseHelper
{
    public static string GetPropertyPath<TEntity, TProperty>(Expression<Func<TEntity, TProperty>> property)
    {                       
         Match match = Regex.Match(property.ToString(), @"^[^\.]+\.([^\(\)]+)$");
         return match.Groups[1].Value;
    }
}

Fügen Sie dann diese Erweiterung für HtmlHelper hinzu:

 public static MvcHtmlString DateBoxFor<TEntity>(
                this HtmlHelper helper,
                TEntity model,
                Expression<Func<TEntity, DateTime?>> property,
                object htmlAttributes)
            {
                DateTime? date = property.Compile().Invoke(model);
                var value = date.HasValue ? date.Value.ToShortDateString() : string.Empty;
                var name = ExpressionParseHelper.GetPropertyPath(property);

                return helper.TextBox(name, value, htmlAttributes);
            }

Außerdem sollten Sie diesen jQuery-Code hinzufügen:

$(function() {
    $("input.datebox").datepicker();
});

datepicker ist ein jQuery-Plugin.

Und jetzt können Sie sie nutzen:

<%= Html.DateBoxFor(Model, (x => x.Entity.SomeDate), new { @class = "datebox" }) %>

ASP.NET MVC2 und DateTime-Format

1voto

Switters Punkte 1563

Um einen stark typisierten Zugriff auf Ihr Modell im Code hinter Ihrer Ansicht zu erhalten, können Sie dies tun:

public partial class SomethingView : ViewPage<T>
{
}

Dabei ist T der ViewData-Typ, den Sie von Ihrer Action übergeben wollen.

Dann würden Sie in Ihrem Controller eine Aktion haben:

public ActionResult Something(){
    T myObject = new T();
    T.Property = DateTime.Today();

    Return View("Something", myObject);
}

Danach haben Sie schöne stark typisierte Modelldaten in Ihrer Ansicht, so dass Sie :

<label>My Property</label>
<%=Html.TextBox(ViewData.Model.Property.ToShortDateString())%>

0 Stimmen

Vielen Dank für die Antwort. Ich bin mir der stark getippten Seiten und der Vorteile, die sie mit sich bringen, bewusst, aber ich glaube, dass dies eher in einer Bearbeitungsansicht anwendbar ist. Ich war speziell auf der Suche nach Informationen, die für die Verwendung eines Modellbinders (in einer Erstellungsansicht) anwendbar sind.

1voto

Ollie Punkte 885

Ich finde, der beste Weg, dies zu tun ist, um die ModelValue zurücksetzen

ModelState.SetModelValue("due", new ValueProviderResult(
       due.ToShortDateString(), 
       due.ToShortDateString(), 
       null));

0voto

Switters Punkte 1563

Ich schätze, persönlich würde ich sagen, dass es am besten oder einfachsten ist, es über eine stark typisierte Seite und eine definierte Modellklasse zu machen, aber wenn Sie wollen, dass es etwas ist, das im Binder lebt, würde ich es auf diese Weise machen:

public class SomeTypeBinder : IModelBinder
{
    public object GetValue(ControllerContext controllerContext, string modelName,
                              Type modelType, ModelStateDictionary modelState)
    {
        SomeType temp = new SomeType();
        //assign values normally
        //If an error then add formatted date to ViewState
        controllerContext.Controller.ViewData.Add("FormattedDate",
                              temp.Date.ToShortDateString());
    }
}

Und verwenden Sie diese dann in der Ansicht, wenn Sie das Textfeld erstellen, d. h. :

<%= Html.TextBox("FormattedDate") %>

Ich hoffe, das hilft.

0voto

RayLoveless Punkte 17624

Das hat bei mir funktioniert: mvc 2

<%: Html.TextBoxFor(m => m.myDate, new { @value = Model.myDate.ToShortDateString()}) %>

Einfach und süß!

Ein Kommentar von user82646, ich dachte, ich mache ihn besser sichtbar.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X