Question

I have an action like this

public ActionResult Overview(TimeAxisVM TimeAxis = null)
{
    return View(new OverviewVM());
}

View model like this

public class TimeAxisVM
{
    // omitted ctor

    [DataType(DataType.DateTime)]
    public DateTime? From { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime? To { get; set; }
}

An editor template for the view model

@model TimeAxisVM

@using (Html.BeginForm("Overview", "Controller", FormMethod.Get))
{
    @Html.EditorFor(model => model.From)

    @Html.EditorFor(model => model.To)

    <button type="submit">Submit</button>
}

And a view for the Overview action like this

@model OverviewVM

@Html.EditorFor(model => model.TimeAxis)

When I execute the GET request this is the query string is TimeAxis.From=22.+02.+2014&TimeAxis.To=25.+02.+2014 but once in the action TimeAxis.From and TimeAxis.To are both null.

If I change the form method to POST it immediately works as expected. From design point of view this should/has to be a GET request.

Any ideas how to make the model binding work for GET?

UPDATE:

Changing the action to

public ActionResult Overview(DateTime? From = null, DateTime? To = null)

and sending the request in this form: .../Overview/?From=22.+02.+2014&To=25.+02.+2014 works as well.

But I'd like to keep it encapsulated in the class and dont need to change the input field name - EditorFor generates them as TimeAxis.From and TimeAxis.To. I might add other properties to the ViewModel/form.

Was it helpful?

Solution

I found the answer. HTTP GET requests are culture invariant, whereas HTTP POST requests respect current culture in ASP.NET MVC.

http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx

OTHER TIPS

If you want to bring the Model again into the view, you need to pass the ModelView back to the View like

return View(TimeAxis);

then, I think you do not have a controller called Controller do you? You might have a HomeController or something else, no?

in that case, please amend you form to

@using (Html.BeginForm("Overview", "Home", FormMethod.Get))

if for example you're Overview action is in the Home controller


all in all, your controller and view should be:

public ActionResult Overview(TimeAxisVM TimeAxis)
{
    return View(TimeAxis);
}

and

@using (Html.BeginForm("Overview", "Home", FormMethod.Get))
{
    @Html.EditorFor(Model => Model.From)

    @Html.EditorFor(Model => Model.To)

    <button type="submit">Submit</button>
}

here's the screencast of the code above: http://screencast.com/t/7G6ofEq0vZEo

Full source: http://ge.tt/1Uh80pK1/v/0?c

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top