我希望有人可以帮助我解决以下问题,这可能非常基础,但我仍然在学习MVC 3.0(以及一般的编码)。
我得到一个值不能为空。尝试根据状态DropDownList中的值将数据加载到我的城市DropDownList时,控制器中的参数名称:String 错误。
我希望我只是遗漏一些基本的东西。 JsonResult getCity 调用中的 int id = int.Parse(state_id)行引发错误。
这是我的控制器:
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>
我现在看了几个小时的Controller和View代码,只是不知道问题是什么。谢谢你的帮助。
答案 0 :(得分:0)
我不知道从哪里开始。看看这段代码我真的不知道从哪里开始。我可以编写关于这段代码有多糟糕的书籍库。但对于初学者:
public JsonResult getCity(string state_id)
应该是:
public JsonResult getCity(string id)
这应该可以解决您的错误。或者可能不是。谁知道。尝试。
让我直接列举一些在我查看您的代码时直接打击我的事情(我只是瞥了一眼):
@using (Html.BeginForm(FormMethod.Post))
- 呃这是什么意思?没有这样的超负荷。您正在调用此重载: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帮助器的正确重载,允许您添加默认值作为第三个参数$.getJSON("/SPServiceLocation/getCity/" + state_id
中的一个可怕的硬编码网址,而不是使用网址助手options += '<option value="' + myData[i].value + '">' + myData[i].text + '</option>';
@Html.HiddenFor(model => model.SPCompanyAccountID, new { @Value = ViewBag.companyID })
不符合您的想法。您无法覆盖value属性。这只会在隐藏字段上生成2个值属性:一个包含大写V
,另一个包含小写v
。$("#CityId").html();
model => model.state
。在.NET标准约定中,规定属性名称应以大写字母是的,基本上我会从头开始。这是我建议的另一种方法,使用视图模型:https://stackoverflow.com/a/4459084/29407