【问题标题】:Telerik Controls with ASP.NET MVC: Does this violate the MVC model?Telerik Controls with ASP.NET MVC:这是否违反了 MVC 模型?
【发布时间】:2010-10-05 08:01:49
【问题描述】:
  1. 将使用MVC enabled Telerik controls ASP.NET MVC违反了MVC模型?

  2. 如果不是,那是什么样的表现 命中(相对于功能和开发速度)将有使用 Telerik 手动控制 编码 HTML?

【问题讨论】:

  • 不是直接答案,但您提供的链接是指在客户端中运行的 AJAX 控件。它们不是“正常”的服务器端控件,所以应该没有问题。回发被特别提及为不受支持。
  • 是的,谢谢,我意识到了这一点。那么这是否意味着它不会违反并且基本上只是一个冗长的 Html Helper 类?是否有比使用 JQuery DatePicker 等更多的性能损失?

标签: asp.net-mvc telerik


【解决方案1】:

我意识到这是一个老问题,但Telerik's ASP.NET MVC controls 只是控件,如日期选择器、网格、面板栏、标签条。这些都不是 MVC 框架的竞争对手。它们 一起工作。您的问题告诉我您不了解,或者至少不了解 MVC 的真正含义。

为了其他可能感到困惑的人的利益,MVC 代表 Model-View-Controller。有一个 Model,表示您用于存储或检索值的对象,还有一个 View,它显示这些对象值并可以通过使用 来设置它们em>控件,例如 Telerik 的日期选择器、网格等,以及 Controller,其中包含呈现视图并与模型元素交互的功能。您用于更新模型的控件必须能够与该模型交互以符合 MVC。如果他们不这样做,那么他们首先不能被宣传为 MVC 控件,所以是的,他们的控件与 MVC 框架一起工作,并且不会“违反”MVC 框架。

以下是日期选择器控件与模型的结合使用:

查看:

@model MyViewModel

<%= Html.Kendo().DateTimePickerFor(model => model.ExpirationDate)
    .Name("datetimepicker")
    .Value(model.ExpirationDate)        
%>

VIEWMODEL:(或模型)

public MyViewModel() {
    public DateTime ExpirationDate { get; set; }
}

控制器:

public ActionResult Index(int id)
{
    var data = dataContext.SomeTable.Where(e => e.ID == id).FirstOrDefault();
    // return View(data); // this would allow you to use @model SomeTable 
    // in your view, and not require a ViewModel, but returns the whole 
    // record for the given ID

    // ViewModels allow you flexibility in what you return
    MyViewModel mvm = new MyViewModel();
    mvm.ExpirationDate = data.ExpirationDate;
    return View(mvm);
}

要使用 Telerik 的演示对它们进行编码,需要对您输入的特定模型和数据进行大量复制/粘贴和各种小的编辑(如上所示)。代码也少得多,因为控件几乎都内置了,所以生产时间当然会大大减少,像过滤、分页、在grids 中排序之类的东西已经存在 - 你只需添加说就可以打开它, Filterable(), 用于过滤。不必创建单独的 DataColumns 并将它们添加到 DataTable,然后将其绑定到网格,然后担心单独的 OnDataBound 事件(您仍然可以这样做,但需要的更少),您实例化了一个网格,添加列,设置用于创建、读取、更新和删除项目的控制器功能,并设置网格上的任何属性,然后您就完成了:

<%: Html.Kendo().Grid<Models.ViewModels.MyViewModel>()
    .Name("grid")
    .Columns(columns =>
    {
        columns.Bound(c => c.ExpirationDate).Format("MM/DD/YYYY");
    })
    .HtmlAttributes(new { style = "height: 380px;" })
    .Scrollable()
    .Sortable()
    .Filterable()
    .Pageable(pageable => pageable
        .Refresh(true)
        .PageSizes(true)
        .ButtonCount(5))
    .DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action("Customers_Read", "Grid"))
        .Create(create => create.Action("Customers_Create", "Grid"))
        .Update(update=> update.Action("Customers_Update", "Grid"))
        .Delete(delete => create.Action("Customers_Delete", "Grid"))
    )
 %>

“读取”就像将上面public ActionResult Index() 中的前两行放入public Customers_Read([DataSourceRequest] DataSourceRequest request) {} 函数中一样简单,该函数将data 作为.ToDataSourceResult() 返回。更新类似于该函数中的最后 3 行,因为您实例化模型,复制从网格传入的模型中的值,然后执行 dataContext.SaveChanges() 之类的操作来保存。保存后,网格会自动进行另一次读取,因此它将看到最新值。无需在回发时运行其他任何东西来重新绑定数据,因此无需编写更多代码。

请看这里的代码示例以更好地了解:http://demos.telerik.com/aspnet-mvc/

【讨论】:

  • 是的,我在很久以前他们第一次发布他们的 MVC 控件时发布了这个。如果我没记错的话,他们当时有点不同。我现在专门使用 MVC 和 ASPNET MVC 的 UI。他们已经走了很长一段路。
【解决方案2】:

就我个人而言,我不会将当前的 Telerik 控件与 MVC 一起使用。我认为它们在某些情况下工作(http://telerikwatch.com/2009/01/telerik-mvc-demo-app-now-available.html),但我认为它们非常以视图状态/回发为中心。了解telerik,他们会推出兼容MVC的版本,但看起来他们面前还有很多工作要做......

【讨论】:

    【解决方案3】:

    关于您的第二个问题,关于性能影响与手动编码,我认为这取决于您使用的控件。例如,如果您在 MVC 中使用任何 Telerik 导航控件,例如 Menu、TabStrip 或 PanelBar,您将节省大量手动编码(因为菜单/标签条/等需要大量客户端提供交互功能的代码(如下拉选项)和许多复杂的 CSS)。因此,MVC 中的 RadControl 将帮助您恢复 -生产力- 您在构建丰富的 ASPNET 应用程序时习惯。

    对于更复杂的控件,例如 Grid,它在很大程度上依赖于回发,您主要从提供的样式中受益。为了适应 MVC 模型,像 Grid 这样的控件需要大量的“自定义”编码来将回发事件“转换”为 URL 操作,因此与 MVC 网格模板相比,您可能不会节省大量代码。不过,您 - 会 - 节省大量的样式时间,而且性能差异应该可以忽略不计。

    希望对您有所帮助。

    -托德

    【讨论】:

      【解决方案4】:

      由于我是构建该演示的人,我想我也可以分享我的意见。根据我的说法,这个示例应用程序不违反 MVC 原则。 RadControls 不依赖于 MVC 应用程序中的 ViewState 或回发(您可以检查生成的输出以自己查看 - 没有 __doPostBack 或 __VIEWSTATE)。实际上,您需要编写一些代码来绑定网格或填充菜单 - 但代码仍然在视图 (ASPX) 中,并且与演示文稿完全相关(这只是我的观点,所以我可能错了)。

      我还应该提到确实存在一些限制 - 一些内置功能(依赖于回发)在 MVC 中不起作用。但是将努力解决它们。如果您对 RadControls 和 ASP.NET MVC 有任何特殊问题,请随时打开支持票证或论坛帖子。

      【讨论】:

      • 谢谢!完成:“感谢您向 Telerik 支持提交您的查询。您的票证 ID 是:189098 作为参考,请在与 Telerik 支持就此查询进行沟通时使用此号码。”
      【解决方案5】:

      我很确定这些依赖于 WebForms 中的 PostBack 模型,并且与 MVC 视图不兼容。您可能会找到一种让它们工作的方法,但这不符合 MVC 原则。如果需要,您可以在同一个网站中混合/匹配 WebForms 和 MVC 视图,但我不建议这样做。

      使用 Telerik 控件将失去的是 MVC 的大部分好处:清晰的关注点分离、增强的可测试性、更精简的 HTML、更简洁的架构。我不会惊讶地发现 Telerik 最终推出了 MVC 控件。现在,如果您需要重用一些通用组件,我会查看客户端的纯 Javascript 实现或手动编码的 ViewUserControl。

      【讨论】:

      • 所以是的,你可以让它们工作,但它们真的坏了,如果你想让它们真正工作(即不仅仅是布局),你将不得不使用破坏 MVC 的 WebForms ,并且他们将来会推出一些 MVC 控件。这不是我说的吗?
      • 好吧,你基本上只是告诉我回发和视图状态不起作用(我已经知道了,所以我澄清了我的帖子问题)。我的问题是 Telerik 控件(在其以 MVC 为中心/“损坏”状态的)是否违反了 MVC,如果没有,与冗长的 HTMLHelpers 或 JQuery 相比,性能损失是多少?
      • 如果您只是将控件用于布局和客户端功能,我看不出这会如何破坏 MVC。如果您需要在代码隐藏中进行设置以使控件正常工作,这将是一个问题。如果你不这样做,你应该没问题。
      猜你喜欢
      • 2011-08-28
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      相关资源
      最近更新 更多