Kendo MVC向索引操作方法发出POST请求

时间:2019-02-28 18:24:35

标签: kendo-ui telerik kendo-asp.net-mvc telerik-mvc kendo-listview

我们将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

  • 该问题与ListView小部件无关,但与datasource有关。 因此,假设其他任何使用数据源的小部件都会看到相同的 行为。 (尽管我尚未与其他小部件一起测试。)
  • 我当前的解决方案是传递Empty枚举而不是null,这样可以解决问题。

但是,我认为这是剑道中的错误

0 个答案:

没有答案