0

我希望有人可以帮助我解决以下问题,这可能非常基础,但我仍在学习 MVC 3.0(以及一般的编码)。

我得到的值不能为空。参数名称:尝试根据状态 DropDownList 中的值将数据加载到我的城市 DropDownList 时,我的控制器中出现字符串错误。

我希望我只是缺少一些基本的东西。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>

我已经查看了这个控制器和视图代码几个小时了,只是不知道问题可能是什么。谢谢您的帮助。

4

1 回答 1

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 帮助器的适当重载,允许您添加默认值作为第三个参数
  • javascript 中一个可怕的硬编码 url:$.getJSON("/SPServiceLocation/getCity/" + state_id而不是使用 Url 助手
  • 用于操作 DOM 的字符串连接:options += '<option value="' + myData[i].value + '">' + myData[i].text + '</option>';
  • @Html.HiddenFor(model => model.SPCompanyAccountID, new { @Value = ViewBag.companyID })不做你认为它做的事。您不能覆盖 value 属性。这只会在您的隐藏字段上生成 2 个值属性:一个带有大写V字母,一个带有小写字母v
  • 一行只有作者才能理解的 javascript 代码:$("#CityId").html();
  • 不遵守 C#/.NET 属性命名约定:model => model.state. 在 .NET 标准约定中,属性名称应以大写字母开头
  • ...

是的,基本上我会从头开始。这是我推荐的另一种方法,使用视图模型:https ://stackoverflow.com/a/4459084/29407

于 2012-07-16T21:04:15.860 回答