2010-10-25 62 views
0

我有一个场景,我必须根据选择的 下拉列表执行某些操作。通过mvc中的控制器启用html下拉列表

对于基本参考你可以使用国家,州,城市的例子。

我能够在当时填写国家列表,我已将其他两个下拉列表设置为 禁用。

国家填充后我想选择state.it正在填充。

两个问题

1)如何保持国家的状态DDL,因为它是回来了orisnal状态。 2)如何通过我的控制器启用下拉菜单。

MyView的代码

国家

 <p> 
     <label> 
      State</label> 
     <%=Html.DropDownList("ddlState", ViewData["ddlState"] as SelectList, "--not selected--",new { onchange = "document.forms[0].submit()", disabled = "disabled" })%> 
    </p> 

    <p> 
     <label> 
      City</label> 
     <%=Html.DropDownList("ddlCities", ViewData["ddlCities"] as SelectList, "--not selected--", new { onchange = "document.forms[0].submit()", disabled = "disabled" })%> 
    </p> 

我控制器代码

public ActionResult InsertData() 
    { 

     var customers = from c in objDetailEntity.Country 
         select new 
         { 
          c.Cid, 
          c.Cname 
         }; 

     SelectList countriesList = new SelectList(customers.Take(100), "Cid", "Cname"); 
     ViewData["ddlCountries"] = countriesList; 

     SelectList EmptyState = new SelectList(customers); 
     ViewData["ddlState"] = EmptyState; 
     ViewData["ddlCities"] = EmptyState; 
     Session["ddlSesCountry"] = countriesList; 
     return View(); 

    } 




    // 
    // POST: /RegisTest/Create 

    [HttpPost] 
    public ActionResult InsertData(FormCollection collection) 
    { 
     try 
     { 
      CountryId = Convert.ToInt16(Request.Form["ddlCountries"]); 
      stateid = Convert.ToInt16(Request.Form["ddlState"]); 
      if (CountryId > 0 && stateid <= 0) 
      { 
       var stateslist = from c in objDetailEntity.State 
           where c.Country.Cid == CountryId 
           select new 
           { 
            c.Sid, 
            c.Sname 
           }; 

       SelectList stateList = new SelectList(stateslist.Take(100), "Sid", "Sname"); 
       ViewData["ddlState"] = stateList; 
       Session["StateList"] = stateList; 
       ViewData["ddlCities"] = stateList; 
      } 

      if (stateid > 0) 
      { 
       var citieslist = from c in objDetailEntity.City 
           where c.State.Sid == stateid 
           select new 
           { 
            c.Ctid, 
            c.Cityname 
           }; 

       SelectList cityList = new SelectList(citieslist.Take(100), "Ctid", "Cityname"); 


       ViewData["ddlCities"] = cityList; 
       ViewData["ddlState"] = Session["StateList"]; 
      } 

      ViewData["ddlCountries"] = Session["ddlSesCountry"]; 



      return View(); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

回答

0

我的选择是不回发的形式在所有。我将在控制器中编写一个采用CountryID并返回包含状态列表的JsonResult的动作。 onchange事件可以调用一个jQuery函数,该函数使用AJAX调用此操作,加载新列表并启用第二个下拉列表。

但是,如果你坚持回传,这里就是为什么它不工作:

  1. 的国家列表不保持其选择的价值,因为该视图正每次都从头开始重新加载和你将其设置为“未选中”。 SelectList构造函数有一个重载,它将“SelectedItem”对象作为第四个参数。当你初始化你的SelectList时,你应该传递适当的值给这个参数,而不是强制它在View中。

  2. 您需要在视图中编写一个“if”子句,以根据某些条件选择是否启用列表。例如,您可以绑定到具有布尔属性(如“EnableStates”)的ViewModel,或者您可以使用类似StateList中值的数量的内容 - 例如,如果计数大于零,则启用它。

一件棘手的事情习惯,当你从Web窗体移动到MVC是,你不必ViewState中了 - 你的应用程序是无状态的。没有什么能够“记住”下拉列表中为您选择的值,您必须在每次加载页面时进行设置。

+0

你可以提供一些代码为1和2条件 – Ankur 2010-10-26 09:47:19