【问题标题】:MVC3 fails to parse JSONMVC3 无法解析 JSON
【发布时间】:2013-06-26 08:53:49
【问题描述】:

使用来自 MVC3 控制器的以下操作:

  [HttpPost]
        public ActionResult GetAsiguratiSuplimentari(int numarAsiguratiSuplimentari, AcpComplexAsigurat[] oldData)
        {
            var newData = new List<AcpComplexAsigurat>(oldData);
            for(int i = newData.Count; i < numarAsiguratiSuplimentari; i++)
            {
                newData.Add(new AcpComplexAsigurat());
            }
            return PartialView("AsiguratiSuplimentari", newData);
        }

和js:

  $("#NumarAsiguratiSuplimentari").change(function (e) {
            var data = { oldData: $("#div-asigurati-suplimentari").find('input').serialize(), numarAsiguratiSuplimentari: $("#NumarAsiguratiSuplimentari").val() };
            var postData = JSON.stringify(data);
            $.post('@Url.Action("GetAsiguratiSuplimentari")', postData, function (data) {
                $("#div-asigurati-suplimentari").html(data);
            });
        });

我想获取用户选择的选择选项并序列化输入表以发送到上述操作:

  <h3>Asigurati</h3>
            <div class="field half odd">
                <label>Numar asigurati suplimentari</label>
                <select id="NumarAsiguratiSuplimentari" name="NumarAsiguratiSuplimentari">
                    @for (int i = 0; i <= 30; i++)
                    {
                        <option value="@i" @(Model.Asigurati.Count == i ? "selected" : "")>@i</option>
                    }
                </select>
            </div>
            <div class="field full" id="div-asigurati-suplimentari">
                @if (Model.Asigurati.Count > 0)
                {
    <table id="Asigurati">
        <thead>
            <tr>
                <th>CNP</th>
                <th>Nume</th>
                <th>Prenume</th>
                <th>Data nasterii</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Asigurati)
            {
                <tr>
                    <td style="padding: 3px;">@Html.TextBoxFor(x => Model.Asigurati[Model.Asigurati.IndexOf(item)].Cnp, new { maxlength = 13 })</td>
                    <td style="padding: 3px;">@Html.TextBoxFor(x => Model.Asigurati[Model.Asigurati.IndexOf(item)].Nume)</td>
                    <td style="padding: 3px;">@Html.TextBoxFor(x => Model.Asigurati[Model.Asigurati.IndexOf(item)].Prenume)</td>
                    <td style="padding: 3px;">@Html.TextBoxFor(x => Model.Asigurati[Model.Asigurati.IndexOf(item)].DataNastere)</td>
                </tr>
            }
        </tbody>
    </table>
                }
            </div>

在单轨中,我必须使用 {JsonBinder] 属性来装饰输入参数,但在 MVC3 中我不确定如何继续。

它基本上给了我以下错误:

参数字典包含参数的空条目 不可为空类型“System.Int32”的“numarAsiguratiSuplimentari” 方法'System.Web.Mvc.ActionResult GetAsiguratiSuplimentari(Int32, BrokerPlatform.Services.AcpComplex.AcpComplexAsigurat[])' 在 'BrokerPlatform.Areas.AcpComplex.Controllers.CarpaticaController'。一个 可选参数必须是引用类型、可为空的类型,或者是 声明为可选参数。参数名称:参数

这是它发送的 JSON:

{"numarAsiguratiSuplimentari":"2","oldData":""}

【问题讨论】:

  • 可以添加发送的原始 JSON 吗?
  • 你到底在哪一行得到了错误?

标签: c# json asp.net-mvc-3 jquery


【解决方案1】:

参数不一致。

public ActionResult GetAsiguratiSuplimentari(int numarAsiguratiSuplimentari?, AcpComplexAsigurat[] oldData)

int? numarAsiguratiSuplimentari 可以为空 ?

    $.post('@Url.Action("GetAsiguratiSuplimentari")', {numarAsiguratiSuplimentari:number,AcpComplexAsigurat:list}, function (data) {

...{numarAsiguratiSuplimentari:number,AcpComplexAsigurat:list}....

您可以解析字符串并获取json,并转换为模型。

我的样本;

[HttpPost()]
public ActionResult GetAsiguratiSuplimentari(string model)
{
    List<myModel> myModel = JsonConvert.DeserializeObject<List<muModel>>(model);
}

【讨论】:

  • 变量 numarAsiguratiSuplimentari 始终存在。它不应该是可空的。至于你的“或”,我不确定我是否理解......
  • ...int numarAsiguratiSuplimentari?,... 语法无效。
  • ...int? numarAsiguratiSuplimentari,... 这是真的,对不起@PLB
  • 好吧,我宁愿使用 MVC3 带来的模型绑定,也不愿手动反序列化输入。以这种方式进行单元测试更难。
  • @Cosmo D PostData 中 numarAsiguratiSuplimentari 的值?
【解决方案2】:

我现在没有 MVC 3,但这在 MVC 4 上运行良好(使用 Fiddler)。您可以尝试以下几种方法:

  • $.post调用中显式设置dataType: "json",jQuery可能猜不出来。
  • 将方法签名更改为接受string 而不是int,MVC 3 中的绑定可能无法自动完成。

如果其中一项有效,请告诉我,以便我删除不正确的选项。

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多