我正在研究Kendo UI jQuery网格CRUD。我可以在网格中显示数据,但不能添加新记录。
当我在弹出窗口中填充列后单击更新按钮以添加记录时,由于每个属性都有一个空值,因此没有任何内容发布到服务器端。 图片显示了按下按钮后得到的内容。
控制器:
scanf("%d", &ch);
JavaScript:
[HttpPost]
public JsonResult AddLostProperty(LostPropertyViewModel lostProperty)
{
try
{
using (var dbContext = new DBEntities())
{
if (lostProperty != null)
{
var newLostProperty = new sz_LostProperty()
{
Name = lostProperty.PropertyName,
CategoryId = dbContext.sz_PropertyCategory.Where(x => x.Name == lostProperty.CategoryName).Select(c => c.Id).FirstOrDefault(),
Description = lostProperty.PropertyDescription,
FoundDate = lostProperty.FoundDate,
FoundLocation = lostProperty.FoundLocation,
CratedDate = DateTime.UtcNow.Date,
CratedBy = ""
};
dbContext.sz_LostProperty.Add(newLostProperty);
dbContext.SaveChanges();
return Json(new { Success = true, Message = "The Property has been added." });
}
else
{
return Json(new { Success = false, Message = "No lost property added." });
}
}
}
catch (Exception e)
{
return Json(new { Success = false, Message = "Error: " + e });
}
}
从浏览器中,我可以在下面看到发送到服务器的对象:
我在做什么错了?
答案 0 :(得分:0)
我认为在这种情况下,服务器端的参数类型存在问题。
您已启用 batch:true 编辑,如果您要在网格中进行许多更改,但最后只发送一个请求,并且更改了模型,这将很有用。例如,在 inCell 编辑模式下,这很有用,当您看到很多请求并希望减少请求时,就可以了,但是在弹出式编辑的情况下,我个人看不到任何原因使用批处理编辑,但是是的,我知道Telerik在他们的演示中有此内容。
因此,由于启用了批处理编辑,因此在执行请求之前将调用parameterMap。 (注意:仅当您启用了批量编辑时,才会调用parameterMap,否则它将被忽略)。该parameterMap将所有模型包装到json字符串数组中,并将带有请求的数组发送到服务器。在您的情况下,总会编辑一条记录,但这没关系-它会以数组形式(以json字符串格式)发送。
因为它是作为序列化字符串发送的,所以可以
1)将AddLostProperty方法的参数更改为字符串模型,然后反序列化为数组,这使您可以像以前那样使用它
public ActionResult AddLostProperty(string models)
{
...
var data = JsonConvert.DeserializeObject<IEnumerable<LostPropertyViewModel>>(models);
...
}
2)如果我们将遵循Telerik演示,则可以使用这种实现方式
public ActionResult AddLostProperty()
{
var products = this.DeserializeObject<IEnumerable<LostPropertyViewModel>>("models");
if (products != null)
{
//logic
}
return this.Jsonp(products);
}
3)这是我想要的解决方案
只需删除 batch:true 和 parameterMap (因为没有批处理就没有用了)-它应该开始将单个对象发送到您的服务器方法。