我们将Telerik的UI用于ASP.NET version 2016.3.1118
,根据demo,我已经在cshtml中配置了ListView小部件,如下所示:
控制器的索引操作方法
[HttpGet]
public async Task<ActionResult> Index()
{
PackagingModelWrapper model = _service.GetPackagingData();
return View(model);
}
Index.cshtml
@model Web.Models.PackagingModelWrapper
@(Html.Kendo().ListView<Web.Models.PackagingModel>(Model.PackagingItems)
.Name("PackagingItems")
.TagName("div")
.ClientTemplateId("myTemplate")
.DataSource(ds=>
{
ds.ServerOperation(false);
})
)
<script type="text/x-kendo-tmpl" id="myTemplate">
<div>
<b>Sequence Number:</b>
#= SequenceNumber #
</div>
页面加载后,我们可以看到带有项目的ListView。但是,内部ListView也在尝试对Index
操作方法进行一个POST调用。并且由于我们在索引操作方法上有HttpGet
,因此POST调用失败。我们可以验证在Fiddler中,第一个呼叫是HttpGet
,然后是HttpPost
。
如果我将cshtml中的ListView注释掉,则只有一个HttpGet
调用。因此,可以肯定的是ListView是这里的罪魁祸首。但不确定我在做什么错
无法从Index方法中删除HttpGet
,因为这将允许HttpPost
进入Index并且两次调用都是不必要的开销。
更新1
经过更多研究后,我发现了
我正在用数据初始化ListView小部件。我们还可以使用BindTo()
方法在初始化期间传递数据。无论如何,主要问题是当数据为null
时,ListView对控制器的默认操作进行POST调用。就我而言,它是当前控制器的Index方法,因为我的默认路由设置为:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
我无法用AutoBind()
或true
设置false
,它会引发错误Cannot set AutoBind if widget is populated during initialization
datasource
有关。
因此,假设其他任何使用数据源的小部件都会看到相同的
行为。 (尽管我尚未与其他小部件一起测试。)但是,我认为这是剑道中的错误