【问题标题】:Why is my action not getting called in ASP.NET MVC 4 web application?为什么在 ASP.NET MVC 4 Web 应用程序中没有调用我的操作?
【发布时间】:2013-11-01 18:40:41
【问题描述】:

我正在尝试将Telerik Kendo ListView 与我的 ASP.NET MVC 4 Web 应用程序一起使用,但我无法填充它。我遵循 Telerik 的 Kendo ListView Controller 和 View 示例,但 DataSourceListViewBuilder 没有被填充。以下是我在FooView中使用的相关代码:

@model IEnumerable<FooViewModel>
<script type="text/x-kendo-tmpl" id="template">
    <div class="Foo">        
        <h3>#:FooName#</h3>            
    </div>
</script>

<div class="FooList">
@(Html.Kendo().ListView<FooViewModel>(Model)
    .Name("listView")
    .TagName("div")
    .ClientTemplateId("template")    
    .DataSource(dataSource => 
    {
        dataSource.Read(read => read.Action("Foo_Read","Foo").Type(HttpVerbs.Get));
        dataSource.PageSize(15);        
    })
    .Pageable()
)
</div>

我希望Foo_ReadFooController 中被执行,但事实并非如此。我怀疑这就是Kendo ListView 没有被填充的原因。那么,有人能告诉我为什么我的Foo_Read 操作没有在FooController 中执行吗?谢谢。

编辑

我包含了相关的控制器代码,但我对其进行了简化,只是为了看看是否可以让 Visual Studio 在 Foo_Read 内部中断,但它没有达到我的断点。

相关FooController.cs代码:

public class FooController : Controller
{
  private Entities db = new Entities();

  public ActionResult Foo_Read([DataSourceRequest] DataSourceRequest request)
  {
    return Json(request, JsonRequestBehavior.AllowGet);
  }
}

【问题讨论】:

  • 分享控制器代码对您也有帮助..
  • @ssilas777,我为你添加了控制器代码,但请记住,我只是想知道为什么Foo_Read 没有被调用(即Visual Studio 没有在Foo_Read 内达到我的断点) .
  • 它可能的 kendo 没有解析渲染部分中的 url,您可以从浏览器开发面板中粘贴生成的
  • 确保您已添加所有必要的脚本文件

标签: c# asp.net asp.net-mvc-4 telerik kendo-ui


【解决方案1】:

您的操作似乎不完整。不应该是这样的:

public ActionResult Foo_Read([DataSourceRequest] DataSourceRequest request)
  {
    return return Json(db.ToDataSourceResult(request));
  }

好吧,在您对我的问题发表评论并看到您自己的问题之后,我的脑海中出现了一些点击。

在您的解决方案中,您正在混合概念。如果您将数据源定义为读取控制器操作,则不需要使用 BindTo 方法。您的解决方案可能绑定到 ViewData 数据而不是读取操作返回的数据。这就是为什么,如果我现在理解正确,我认为您应该使用“AutoBind(true)”,如下所示:

@model IEnumerable<FooViewModel>
<script type="text/x-kendo-tmpl" id="template">
    <div class="Foo">        
        <h3>#:FooName#</h3>            
    </div>
</script>

<div class="FooList">
@(Html.Kendo().ListView<FooViewModel>(Model)
    .Name("listView")
    .TagName("div")
    .ClientTemplateId("template").AutoBind(true)    
    .DataSource(dataSource => 
    {
        dataSource.Read(read => read.Action("Foo_Read","Foo").Type(HttpVerbs.Get));
        dataSource.PageSize(15);        
    })
    .Pageable()
)
</div>

您可能还想查看here 看看它是否对您有帮助。

【讨论】:

  • 谢谢@Stargazer,但这不是我问题的核心。我想知道为什么Foo_Read 甚至没有被调用(即VS 没有在Foo_Read 内的断点处停止)。我基本上只是暂时把它存起来。我确实弄清楚了我错过了什么,并将很快发布我的答案。
  • 哦,那好吧。 :) 我也错过了断点 ;) 无论如何,我已经将我的答案编辑为更准确的答案。希望对您有所帮助。
【解决方案2】:

我想通了。应该是这样的:

@model IEnumerable<FooViewModel>
<script type="text/x-kendo-tmpl" id="template">
    <div class="Foo">        
        <h3>#:FooName#</h3>            
    </div>
</script>

<div class="FooList">
@(Html.Kendo().ListView<FooViewModel>(Model)
    .Name("listView")
    .TagName("div")
    .ClientTemplateId("template")    
    .DataSource(dataSource => 
    {
        dataSource.Read(read => read.Action("Foo_Read","Foo").Type(HttpVerbs.Get));
        dataSource.PageSize(15);        
    })
    .BindTo((IEnumerable<FooViewModel>)ViewData["listView"])
    .Pageable()
)
</div>

注意我添加的.BindTo((IEnumerable&lt;FooViewModel&gt;)ViewData["listView"])。显然,这有所作为。不过,不完全确定为什么。 Telerik 的示例没有那条线。

【讨论】:

    【解决方案3】:

    使用最新版本的 kendo,您可以设置 .AutoBind(true),然后在第一次加载列表视图时执行读取事件。

    也可以从 javascript 中调用 read 方法:

    $(document).ready(function () {
        var listView = $("#lstview").data("kendoListView");
        listView.dataSource.read();
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2020-10-30
      • 1970-01-01
      相关资源
      最近更新 更多