在使用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>
当我发帖时总是得到正确的计数,但值为空。
在这里请求的是json,我知道它很接近,但我不知道如何获得父SeeAlso容器。
{"SelectedCategories":["Cat1","Cat2"]}
答案 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());
}
}