KeelRisk
KeelRisk

Reputation: 749

MVC3 Drop Down List Control does not keep State, Why?

I have a drop down list control on a partial view and after posting the form the state of the drop down list control is not maintained

Here is the partial view cshtml code:

@model MvcApplication1.Models.TestCriteriaConsolidated


@using (Html.BeginForm("Results", "Home"))
{
 <div style="float:left">
                <div style="font-weight:bold">                
                    @Html.LabelFor(m => m.testCriteria.Year)
                </div>
                <div style="width:110px; ">   
                     @Html.DropDownListFor(m => m.testCriteria.Year, new SelectList(new[] 
                     { 

                        new SelectListItem{ Text="All Years", Value=" " },
                        new SelectListItem{ Text="2010", Value="2010" },
                        new SelectListItem{ Text="2009", Value="2009" },
                        new SelectListItem{ Text="2008", Value="2008" },
                        new SelectListItem{ Text="2007", Value="2007" },
                        new SelectListItem{ Text="2006", Value="2006" }

                     }, "Value", "Text", "1"), new { @style = "width: 100px; margin-top: 5px" })          
                </div>
            </div>

            <div style="float:left">
                <div>                
                    &nbsp;
                </div>
                <div style="width:100px; ">                                
                     <input type="submit"  value="Results" />
                </div>
            </div>

}

Here is my controler code:

 public ActionResult Index()
    {                     
        return View();
    }

    public ActionResult Results()
    {
        string year = Request.Form["testCriteria.Year"];

        List<TestCriteriaResults> test = new List<TestCriteriaResults>();

        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "one", Value3="three", Value4="Four" });
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "two", Value3="three", Value4="four" });
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "two", Value3 = "three", Value4 = "four" });
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "two", Value3 = "three", Value4 = "four" });
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "two", Value3 = "three", Value4 = "four" });           

        TestCriteriaConsolidated combined = new TestCriteriaConsolidated();
        combined.testCriteriaResults = test;

        return PartialView(combined);
    }

NEWLY MODIFIED ACTION METHOD(This still does not maintain state):

public ActionResult Results()
    {
        string year = Request.Form["testCriteria.Year"];


        List<TestCriteriaResults> test = new List<TestCriteriaResults>();

        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "one", Value3="three", Value4="Four" });
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "two", Value3="three", Value4="four" });
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "two", Value3 = "three", Value4 = "four" });
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "two", Value3 = "three", Value4 = "four" });
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "two", Value3 = "three", Value4 = "four" });           

        TestCriteriaConsolidated combined = new TestCriteriaConsolidated();
        TestCriteria criteria = new TestCriteria() { Year = year };

        combined.testCriteriaResults = test;
        combined.testCriteria = criteria;

        return PartialView(combined);
    }

Upvotes: 1

Views: 2013

Answers (2)

CRice
CRice

Reputation: 12567

combined.testCriteria.Year needs to get set with the form value you posted

Try this

[HttpPost]
    public ActionResult Results(TestCriteriaConsolidated form)
    {
        List<TestCriteriaResults> test = new List<TestCriteriaResults>();
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "one", Value3 = "three", Value4 = "Four" });
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "two", Value3 = "three", Value4 = "four" });
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "two", Value3 = "three", Value4 = "four" });
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "two", Value3 = "three", Value4 = "four" });
        test.Add(new TestCriteriaResults { Value1 = "one", Value2 = "two", Value3 = "three", Value4 = "four" });

        TestCriteria criteria = new TestCriteria() { Year = form.testCriteria.Year };

        TestCriteriaConsolidated combined = new TestCriteriaConsolidated
                                                {
                                                    testCriteriaResults = test,
                                                    testCriteria = criteria
                                                };
        return View(combined);
    }

    public ActionResult Results() 
    { 
        return View(new TestCriteriaConsolidated());
    }

Upvotes: 0

cwharris
cwharris

Reputation: 18125

The following code creates the view model for your next partial view:

TestCriteriaConsolidated combined = new TestCriteriaConsolidated();
combined.testCriteriaResults = test;

You need to set the year on this model:

combined.testCriteria.Year = Request.Form["testCriteria.Year"];

Upvotes: 1

Related Questions