Option value not getting passed (.NET + Ajax)

huangapple go评论72阅读模式
英文:

Option value not getting passed (.NET + Ajax)

问题

你的代码部分看起来没问题,但错误信息 "Object reference not set to an instance of an object" 表示在提交表单时,可能出现了一个空引用异常。这通常是因为在控制器中的 FetchGemeenteObvPostcode 方法没有正确地设置模型数据,导致在 AdresWijzigen 方法中找不到预期的数据。

你可以确保以下事项:

  1. 确保 FetchGemeenteObvPostcode 方法返回的 JSON 数据中包含了正确的数据,尤其是 NieuwPlaatsNaam 的值。

  2. 确保 AdresWijzigenViewModel 模型中有一个名为 NieuwPlaatsNaam 的属性,且该属性有正确的设置方法,以便接收从前端传递的数据。

  3. 在提交表单后,在 AdresWijzigen 方法中检查 viewModel 对象的属性是否都有正确的值。你可以使用调试器来跟踪数据流,查看哪个属性没有被正确设置。

如果你仍然遇到问题,可以提供更多关于 AdresWijzigenViewModelFetchGemeenteObvPostcode 方法的代码,以便更具体地帮助你解决问题。

英文:

I have a dropdown where I use ajax to fetch the select options.

<form asp-action="AdresWijzigen">

    <input asp-for="KlantId" hidden />
    <input asp-for="AdresType" hidden />
    <input asp-for="OudStraat" hidden />
    <input asp-for="OudHuisNummer" hidden />
    <input asp-for="OudBus" hidden />
    <input asp-for="OudPlaatsId" hidden />
    <input asp-for="OudPlaatsNaam" hidden />


    <div>
        <label asp-for="NieuwStraat"></label>
        <span asp-validation-for="NieuwStraat" class="text-danger"></span>
        <input asp-for="NieuwStraat" />
    </div>

    <div>
        <label asp-for="NieuwHuisNummer"></label>
        <span asp-validation-for="NieuwHuisNummer" class="text-danger"></span>
        <input asp-for="NieuwHuisNummer" />
    </div>

    <div>
        <label asp-for="NieuwBus"></label>
        <input asp-for="NieuwBus" />
    </div>

    <div>
        <label>Postcode</label>
        <input type="text" id="postcodeInput" name="postcodeInput" placeholder="Geef een postcode in" />
        <input type="button" id="zoekGemeente" name="zoekGemeente" value="🔍" />
        <p id="errorPostcode" class="text-danger" style="display:none"></p>

        <div id="gemeenteSelect"></div>
    </div>

    <div>
        <input type="submit" value="Adres wijzigen" class="btn btn-primary" />
    </div>
</form>
    <script>
        $("#zoekGemeente").click(function () {
            var url = "@Url.Action("FetchGemeenteObvPostcode", "Klant")";
            var data = $("#postcodeInput").val();
            var $postcodeControl = /^\d{4}$/;

            if (data.match($postcodeControl)) {
                $("#errorPostcode").css('display', 'none');

                $.ajax({
                    type: "POST",
                    url: url,
                    dataType: "JSON",
                    data: { postcode: $("#postcodeInput").val() },
                    success: function (data) {
                        if (data.length < 1) {
                            $("#errorPostcode").css('display', 'inline-block');
                            $("#errorPostcode").text("Geen gemeente gevonden voor postcode " + $("#postcodeInput").val());
                            $("#gemeenteSelect").empty();
                        } else {
                            var g = '<select asp-for="NieuwPlaatsId">';
                            for (var i = 0; i < data.length; i++) {
                                g += '<option value="' + data[i].plaatsId + '">' + data[i].plaatsNaam + '</option>';
                            }
                            g += '</select>';
                            $("#gemeenteSelect").html(g);
                        }
                    }
                })
            } else {
                $("#errorPostcode").css('display', 'inline-block');
                $("#errorPostcode").text("Geldige postcode moet uit 4 cijfers bestaan");
                $("#gemeenteSelect").empty();
            }
        })
    </script>
        [HttpPost]
        public JsonResult FetchGemeenteObvPostcode(string postcode)
        {
            var gemeentes = klantenRepository.GetPlaatsenByPostcodes(postcode);
            return Json(gemeentes);
        }

        //Valideer viewModel, als valid redirect naar WijzigenAdresBevestigen()
        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult AdresWijzigen(AdresWijzigenViewModel viewModel)
        {
            if (ModelState.IsValid)
            {
                return RedirectToAction(nameof(WijzigingAdresBevestigen),viewModel);
            }
            else
            {
                List<Plaats> plaatsen = new List<Plaats>();
                plaatsen = _context.Plaatsen.ToList();
                ViewData["NieuwAdres"] = plaatsen;

                return View(viewModel);
            }
        }

// Redirect to page that requests confirmation
        public async Task<IActionResult> WijzigingAdresBevestigen(AdresWijzigenViewModel viewModel)
        {
            var nieuwPlaats = await _context.Plaatsen.FindAsync(viewModel.NieuwPlaatsId);
            Console.WriteLine(nieuwPlaats);
            ViewData["NieuwPlaatsNaam"] = nieuwPlaats.PlaatsNaam;
            return View(viewModel);
        }

The fetch works fine, and the html select option value gets filled with the correct id's. However, when I submit the form, the option value that is filled in using ajax does not get filled into the model that is passed to the controller.

ViewData["NieuwPlaatsNaam"] = nieuwPlaats.PlaatsNaam;

^ this is the line that returns a "Object reference not set to an instance of an object" error on submit

Am I missing something?

答案1

得分: 2

解决方法是直接在HTML中添加<select asp-for=...>标记,因为似乎在使用JavaScript添加时asp-for无法正常工作(正如@PeterB在评论中指出的)。

    <div>
        <label>邮政编码</label>
        <input type="text" id="postcodeInput" name="postcodeInput" placeholder="输入邮政编码" />
        <input type="button" id="zoekGemeente" name="zoekGemeente" value="&#128269;" />
        <p id="errorPostcode" class="text-danger" style="display:none"></p>

        <select id="gemeenteSelect" asp-for="NieuwPlaatsId" style="display:none"></select>
    </div>
....
                        if (data.length < 1) {
                            $("#errorPostcode").css('display', 'inline-block');
                            $("#errorPostcode").text("未找到与邮政编码 " + $("#postcodeInput").val() + " 相关的城市");
                            $("#gemeenteSelect").css('display', 'none');
                        } else {
                            var g = '';
                            for (var i = 0; i < data.length; i++) {
                                g += '<option value="' + data[i].plaatsId + '">' + data[i].plaatsNaam + '</option>';
                            }
                            $("#gemeenteSelect").css('display', 'inline-block');
                            $("#gemeenteSelect").append(g);
                        }
....
英文:

Solved by adding the &lt;select asp-for=...&gt; tag in the HTML directly, as it seems that the asp-for doesn't work when added using Javascript (as pointed out by @PeterB in the comments).

    &lt;div&gt;
        &lt;label&gt;Postcode&lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;postcodeInput&quot; name=&quot;postcodeInput&quot; placeholder=&quot;Geef een postcode in&quot; /&gt;
        &lt;input type=&quot;button&quot; id=&quot;zoekGemeente&quot; name=&quot;zoekGemeente&quot; value=&quot;&#128269;&quot; /&gt;
        &lt;p id=&quot;errorPostcode&quot; class=&quot;text-danger&quot; style=&quot;display:none&quot;&gt;&lt;/p&gt;

        **&lt;select id=&quot;gemeenteSelect&quot; asp-for=&quot;NieuwPlaatsId&quot; style=&quot;display:none&quot;&gt;&lt;/select&gt;**
    &lt;/div&gt;
....
                        if (data.length &lt; 1) {
                            $(&quot;#errorPostcode&quot;).css(&#39;display&#39;, &#39;inline-block&#39;);
                            $(&quot;#errorPostcode&quot;).text(&quot;Geen gemeente gevonden voor postcode &quot; + $(&quot;#postcodeInput&quot;).val());
                            $(&quot;#gemeenteSelect&quot;).css(&#39;display&#39;, &#39;none&#39;);
                        } else {
                            var g = &#39;&#39;;
                            for (var i = 0; i &lt; data.length; i++) {
                                g += &#39;&lt;option value=&quot;&#39; + data[i].plaatsId + &#39;&quot;&gt;&#39; + data[i].plaatsNaam + &#39;&lt;/option&gt;&#39;;
                            }
                            $(&quot;#gemeenteSelect&quot;).css(&#39;display&#39;, &#39;inline-block&#39;);
                            $(&quot;#gemeenteSelect&quot;).append(g);
                        }
....

huangapple
  • 本文由 发表于 2023年2月14日 05:34:31
  • 转载请务必保留本文链接:https://go.coder-hub.com/75441398.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定