2012-07-16 43 views
0

我希望有人可以幫助我解決以下問題,這可能是非常基本的,但我仍然在學習MVC 3.0(和一般編碼)。級聯DropDownLists - 值不能爲空。參數名稱:字符串錯誤

我收到值不能爲空。參數名稱:字符串當我嘗試將數據加載到我的城市DropDownList時,基於狀態DropDownList中的值發生錯誤。

我希望我只是缺少一些基本的東西。 int id = int.Parse(state_id)內線JsonResult getCity調用正在拋出錯誤。

這裏是我的控制器:

public ActionResult Create() 
    { 
     ViewBag.sessionName = HttpContext.Session["SPCompanyName"].ToString(); 
     var compID = HttpContext.Session["SPCompanyAccountID"].ToString(); 
     ViewBag.companyID = compID; 

     List<SelectListItem> list = new List<SelectListItem>(); 
     list.Add(new SelectListItem { Text = "Select State", Value = "Default State" }); 
     var states = (from c in simpleDB.simpleState select c).ToArray(); 
      for (int i = 0; i < states.Length; i++) 
      { 
       list.Add(new SelectListItem { Text = states[i].stateFull, Value = states[i].Id.ToString() }); 
      } 
     ViewData["states"] = list;//data for DropdownList State 

     List<SelectListItem> list1 = new List<SelectListItem>(); 
     list1.Add(new SelectListItem { Text = "Select City", Value = "Default City" }); 
     ViewData["cities"] = list1;//data for Dropdownlist City 
     return View(); 

    } 

    [AcceptVerbs(HttpVerbs.Get)] 
    public JsonResult getCity(string state_id) 
    { 
     int id = int.Parse(state_id); 
     var myData = (from m in simpleDB.simpleCity where m.simpleStateId == id select new { text = m.cityFull, value = m.Id }); 

     return this.Json(myData, JsonRequestBehavior.AllowGet); 
    } 

這裏是我查看全碼:

@using (Html.BeginForm(FormMethod.Post)) 

{

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function() { 
    $('#StateId').change(function() { 
     var state_id = $(this).val(); //get State ID when select value change 

     $.getJSON("/SPServiceLocation/getCity/" + state_id, {}, 

    function (myData) { 
     var options = ''; 
     for (var i = 0; i < myData.length; i++) { 
      options += '<option value="' + myData[i].value + '">' + myData[i].text + '</option>'; 
     } 
     $("#CityId").html(); 
     $("#CityId").html(options); 
    }); 
    }); 
}); 
</script> 

@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Step 4: Service Areas</legend> 

    @Html.HiddenFor(model => model.SPCompanyAccountID, new { @Value = ViewBag.companyID }) 


    <div class="editor-label"> 
     @Html.LabelFor(model => model.state) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("state", (IEnumerable<SelectListItem>)ViewData["states"], new { id = "StateId", @class = "chzn-select" }) 
     @Html.ValidationMessageFor(model => model.state) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.city) 
    </div> 

    <div class="editor-field" id="SP_SelectCity"> 
     @Html.DropDownList("city", (IEnumerable<SelectListItem>)ViewData["cities"], new { id = "CityId", @class = "chzn-select" }) 
     @Html.ValidationMessageFor(model => model.city) 
    </div> 

    <p> 
     <input type="submit" value="Submit" /> 
    </p> 
</fieldset> 

我已經看了這個控制器和視圖代碼現在幾個小時,只是不知道問題可能是什麼。謝謝您的幫助。

+0

把警報在您的JS之後您將STATE_ID變量 - 警報(STATE_ID),並確保你實際上是抓住了價值。此外,如果你沒有一個路徑設置爲/ SPServiceLocation/getCity/STATEID,您將需要使用傳遞參數(/ SPServiceLocation/getCity STATE_ID = MD?) – Tommy 2012-07-16 17:48:19

+0

通過我的教程[1]正常的方法:HTTP: //www.asp.net/mvc/tutorials/javascript/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc [2]:HTTP:// blogs.msdn.com/b/rickandy/archive/2012/01/09/cascasding-dropdownlist-in-asp-net-mvc.aspx – RickAndMSFT 2012-07-16 18:41:30

回答

0

我不知道從哪裏開始。看着這段代碼,我真的不知從哪裏開始。我可以編寫有關此代碼有多糟糕的書籍庫。但對於初學者:

public JsonResult getCity(string state_id) 

應該是:

public JsonResult getCity(string id) 

這或許應該改正錯誤。或者可能不是。誰知道。嘗試。

讓我列舉一兩件事情可以直接打我,當我看着你的代碼(我只是做了一個看一眼吧):

  • @using (Html.BeginForm(FormMethod.Post)) - Ermmm是什麼?你是說這個?沒有這樣的過載。你正在調用這個過載:public static MvcForm BeginForm(this HtmlHelper htmlHelper, object routeValues);。可能你的意思是@using (Html.BeginForm())
  • 返回一個視圖沒有通過模型來它:return View();,但似乎使用強類型的視圖
  • ViewBag.XXX,而不是使用一個視圖模型
  • list.Add(new SelectListItem { Text = "Select State", Value = "Default State" });,而不是使用DropDownListFor助手的適當重載允許您添加默認值作爲第三個參數
  • 一個可怕的硬編碼的URL在JavaScript:中$.getJSON("/SPServiceLocation/getCity/" + state_id而不是使用網址助手
  • 字符串串聯操作DOM:options += '<option value="' + myData[i].value + '">' + myData[i].text + '</option>';
  • @Html.HiddenFor(model => model.SPCompanyAccountID, new { @Value = ViewBag.companyID })不符合你的想法。您無法覆蓋值屬性。這隻會在您的隱藏字段上生成兩個值屬性:一個是大寫字母V,另一個是小寫字母v
  • JavaScript代碼,只有它的作者可以理解的線什麼的做的:$("#CityId").html();
  • 不尊重C#/房產NET命名約定:model => model.state。在.NET標準約定決定了屬性名稱應以大寫字母
  • 開始...

是啊,基本上我會從頭開始。這裏有一個替代的辦法,我會建議,使用視圖模型:https://stackoverflow.com/a/4459084/29407

+0

很明顯你從來沒有見過真正的殘暴代碼... – AdamV 2012-07-16 21:10:08

+1

@AdamD,哦~~我有比這更糟糕。我做了很多代碼評論。我其實做代碼評論的生活。相信我,這是糖相比,我所看到的:-) – 2012-07-16 21:13:01

+0

讓我看看這些意見,看看我能做些什麼來解決的事情了。這實際上是我的第一個ASP.NET項目,所以可以肯定地從頭開始。 – 2012-07-16 22:32:01

相關問題