0

誰かが以下の問題について私を助けてくれることを願っています。これはおそらく非常に基本的なことですが、私はまだMVC 3.0(および一般的なコーディング)を学んでいます。

値をnullにすることはできません。パラメータ名:状態DropDownListの値に基づいて、市のDropDownListにデータを読み込もうとしたときに、コントローラ内で文字列エラーが発生しました。

基本的なものが欠けているだけだといいのですが。JsonResultgetCity呼び出し内のintid= 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 ヘルパーの適切なオーバーロードを使用する代わりに、3 番目の引数としてデフォルト値を追加できます
  • JavaScript にハードコードされた恐ろしい URL: $.getJSON("/SPServiceLocation/getCity/" + state_idUrl ヘルパーを使用する代わりに
  • DOM を操作するための文字列連結:options += '<option value="' + myData[i].value + '">' + myData[i].text + '</option>';
  • @Html.HiddenFor(model => model.SPCompanyAccountID, new { @Value = ViewBag.companyID })あなたが思っていることをしません。value 属性をオーバーライドすることはできません。これは、非表示フィールドに 2 つの値属性を生成するだけです。1Vつは大文字で、もう 1 つは小文字vです。
  • その作成者だけが何をしているのか理解できる JavaScript コードの行:$("#CityId").html();
  • プロパティの C#/.NET 命名規則が守られていません: model => model.state. .NET 標準の規則では、プロパティ名は大文字で始める必要があります。
  • ...

ええ、基本的には最初からやり直します。ビューモデルを使用して、私がお勧めする別のアプローチを次に示します: https://stackoverflow.com/a/4459084/29407

于 2012-07-16T21:04:15.860 に答える