Ajax发布到MVC控制器List <t>属性正确计数但是null

时间:2016-11-08 17:20:12

标签: c# ajax asp.net-mvc

在使用Telerik MultiSelect控件的MVC中,我通过ajax发回给控制器。我的数据是正确的,但是我错过了一些关于如何让POST操作解释ajax数据参数的连接,因为它始终是正确的元素数,但它们都是空的。

我的模特:

public class SeeAlso
{
    public List<SubCategories> SelectedCategories { get; set; }
    public List<SubCategories> AvailableCategories { get; set; }
}

我的控制器

[AcceptVerbs(HttpVerbs.Post)]
public async Task<ActionResult> SeeAlso_Update(SeeAlso data)
{
   if (data != null && ModelState.IsValid)
   {...}
}

我的cshtml:

<h2>See Also</h2>

@using (Html.BeginForm())
{
<label for="required">Selected</label>
@(Html.Kendo().MultiSelect()
  .Name("SeeAlso")
  .Placeholder("Selected Categories...")
  .BindTo(Model.AvailableCategories.Select(x => x.SubCategoryName).ToList())
  .Value(Model.SelectedCategories.Select(c => c.SubCategoryName).ToArray())
  .Events(e => { e.Change("onChange"); })
)
}

<script type="text/javascript">
function onChange()
{
    $.ajax({
        url: "/Admin/SeeAlso/SeeAlso_Update",
        type: "POST",
        async: true,
        dataType: "json",
        contentType: "application/json",

        data: JSON.stringify({ SelectedCategories: $("#SeeAlso").data("kendoMultiSelect").dataItems() })

    });

}

</script>

当我发帖时总是得到正确的计数,但值为空。

enter image description here

在这里请求的是json,我知道它很接近,但我不知道如何获得父SeeAlso容器。

{"SelectedCategories":["Cat1","Cat2"]}

3 个答案:

答案 0 :(得分:1)

您无法将Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/GenTraversableOnce$class at kafka.utils.Pool.<init>(Pool.scala:28) at kafka.consumer.FetchRequestAndResponseStatsRegistry$.<init>(FetchRequestAndResponseStats.scala:60) 绑定到复杂对象的集合(它仅回发和所选选项的值的数组),因此您需要绑定的属性需要为<select multiple>(假设IEnumerable<string>是typeof SubCategoryName)。您需要查看模型

string

要使用ajax提交模型,您只需序列化表单

即可
public class SeeAlso
{
    public IEnumerable<string> SelectedCategories { get; set; }
    public List<SubCategories> AvailableCategories { get; set; }
}

将正确绑定到

$.ajax({
    url: "/Admin/SeeAlso/SeeAlso_Update",
    type: "POST",
    dataType: "json",
    data: $('form').serialize();
});

[HttpPost] public ActionResult SeeAlso_Update(SeeAlso model) 将是所选选项值的数组。

答案 1 :(得分:0)

我的猜测是,SubCategories类中的JSON映射与传递的内容不完全匹配。如果您暂时将数据变量更改为 object 的类型,然后逐步执行它,您应该会看到一个匿名类型,它将显示实际传递的内容。或者您可以查看Chrome中开发人员工具的“网络”标签,查看即将发布的实际JSON - 它可能会有一些细微差别。

答案 2 :(得分:0)

我忙于工作并为延迟回到此事而道歉。所以最后我需要一个混合的答案,但由于我缺乏知识,我没有把问题弄清楚。 @Stephen Muecke最有帮助,我接受了他的回答。但是,如果它帮助了那里的人,那么我最终是如何使一切运转起来的。

型号:

public class SeeAlso
{
    public List<int> SelectedCategories { get; set; }
    public List<SubCategories> AvailableCategories { get; set; }
}

public class SubCategories
{
    public int Id { get; set; }

    public string SubCategoryName { get; set; }

    public int CategoryId { get; set; }

}

CSHTML:

<div>
<h2>See Also</h2>

<label for="required">Selected</label>

@(Html.Kendo().MultiSelectFor(m => m.SelectedCategories)
        .Placeholder("Selected Categories...")
        .DataTextField("SubCategoryName")
        .DataValueField("Id")
        .BindTo(Model.AvailableCategories)
        )

<br/>
<button type="submit" name="saveButton" id="saveButton">Save</button>
<br/>

</div>

<script type="text/javascript">
$("#saveButton").click(function () {
    $.ajax({
        url: "/Admin/SeeAlso/Update",
        type: "POST",
        dataType: "json",
        contentType: "application/json",
        data: JSON.stringify({ SelectedCategories: $("#SelectedCategories").data("kendoMultiSelect").dataItems() })
    })
});
</script>

控制器:

[RoutePrefix("Admin/SeeAlso")]
public class SeeAlsoController : Controller
{

   [HttpPost]
   [Route("Update")]
   public async Task<ActionResult> SeeAlso_Update(List<SubCategories> SelectedCategories)
   {
        if (SelectedCategories != null && ModelState.IsValid)
        { ... }
        return Json(ModelState.ToDataSourceResult());
   }
}