Skip to content Skip to sidebar Skip to footer

Does Html.textbox Uses Request.params Instead Of Model?

I have a simple test application: Model: public class Counter { public int Count { get; set; } public Counter() { Count = 4; } } Controller: public class

Solution 1:

Html.TextBox() uses internally ViewData.Eval() method which first attempts to retrieve a value from the dictionary ViewData.ModelState and next to retrieve the value from a property of the ViewData.Model. This is done to allow restoring entered values after invalid form submit.

Removing Count value from ViewData.ModelState dictionary helps:

public ActionResult Increment(Counter counter)
{
    counter.Count++;
    ViewData.ModelState.Remove("Count");
    return View(counter);
}

Another solution is to make two different controller methods for GET and POST operations:

public ActionResult Increment(int? count)
{
    Counter counter = new Counter();

    if (count != null)
        counter.Count = count.Value;

    return View("Increment", counter);
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Increment(Counter counter)
{
    counter.Count++;

    return RedirectToAction("Increment", counter);
}

Counter object could also be passed via TempData dictionary.

You may also be interested in the article Repopulate Form Fields with ViewData.Eval() by Stephen Walther.

Solution 2:

That's not the issue here. Specifying

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

is equivalent to specifying

<%= Html.TextBox("Count", null) %>

which will pull the matching value (named "Count") from the ModelStateDictionary.

But even so, explicitly passing in

<%= Html.TextBox("Count", Model.Count) %>

results in the same behavior described by alex2k8.

Solution 3:

Html.TextBox has more parameters than one..first parameter is the name or id of input element, and the second one is the value...

so write your textbox helper like this:

<%= Html.TextBox("Count",Model.Count) %>

cheers

Post a Comment for "Does Html.textbox Uses Request.params Instead Of Model?"