Lars Holdgaard
Lars Holdgaard

Reputation: 9986

Date is empty in view textboxfor when adding type "date"

Weird problem that is probably very obvious. In my view model I have a date, which I set in the controller. When I render the textbox in the view, it is empty.

View model:

   [DataType(DataType.Date)]
   [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}")]
   public DateTime DateStart { get; set; }

Controller:

    //GET: InvoicePrice
    public ActionResult Index(InvoicePriceViewModel model)
    {
        model.DateStart = DateTime.Now;
        return View(model);
    }

HTML of view:

    <p>
      Date:<br />
            @Html.TextBoxFor(model => model.DateStart, new { @class = "form-control", placeholder = "Invoice date", type = "date" })
     </p>

When I open this, I get the empty textbox here:

enter image description here

And I would expect to see "28-11-2017" as my current date.

I guess I am missing something obvious here. But what is it?

Upvotes: 3

Views: 3781

Answers (2)

Zabavsky
Zabavsky

Reputation: 13640

There is actually a couple of issues here and I'll try to explain them.

The first problem is that date input accepts values only in yyyy-mm-dd format and displays them based on the browser localization settings:

One thing to note is that the displayed date format differs from the actual value — the displayed date format will be chosen based on the set locale of the user's browser, whereas the date value is always formatted yyyy-mm-dd.

This means you need to change your DataFormatString and also set ApplyFormatInEditMode to true:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]

However it still won't have any effect because in order for your custom format to be taken into account you need to use Html.EditorFor:

@Html.EditorFor(model => model.DateStart,
    new { htmlAttributes = new { @class = "form-control", placeholder = "Invoice date" } })

Or you can ignore DisplayFormatAttribute and specify the format in the Html.TextBoxFor:

@Html.TextBoxFor(model => model.DateStart, "{0:yyyy-MM-dd}",
    new { @class = "form-control", placeholder = "Invoice date", type = "date" })

Upvotes: 5

Mark
Mark

Reputation: 11

try something like this:

@foreach (var item in Model)
{
    <p>
      Date:<br />
            @Html.TextBoxFor(modelItem  => item.DateStart, new { @class = "form-control", placeholder = "Invoice date", type = "date" })
    </p>
}

Upvotes: 0

Related Questions