将启用 MVC 的 Telerik 控件与 ASP.NET MVC 一起使用会违反 MVC 模型吗?
如果没有,使用 Telerik 控件而不是手动编码 HTML 会有什么样的性能影响(相对于功能和开发速度)?
5 回答
由于我是构建该演示的人,我想我也可以分享我的意见。根据我的说法,这个示例应用程序不违反 MVC 原则。RadControls 不依赖于 MVC 应用程序中的 ViewState 或回发(您可以检查生成的输出以自己查看 - 没有 __doPostBack 或 __VIEWSTATE)。实际上,您需要编写一些代码来绑定网格或填充菜单 - 但代码仍然在视图 (ASPX) 中,并且与演示文稿完全相关(这只是我的观点,所以我可能错了)。
我还应该提到确实存在一些限制 - 一些内置功能(依赖于回发)在 MVC 中不起作用。但是将努力解决它们。如果您对 RadControls 和 ASP.NET MVC 有任何特殊问题,请随时打开支持票证或论坛主题。
对于您的第二个问题,关于性能影响与手动编码,我认为这取决于您使用的控件。例如,如果您在 MVC 中使用任何 Telerik 导航控件,例如 Menu、TabStrip 或 PanelBar,您将节省大量手动编码(因为菜单/标签条/等需要大量客户端提供交互功能的代码(如下拉选项)和许多复杂的 CSS)。因此,MVC 中的 RadControls 将有助于恢复您在构建丰富的 ASPNET 应用程序时习惯的生产力。
对于更复杂的控件,例如 Grid,它在很大程度上依赖于回发,您主要从提供的样式中受益。为了适应 MVC 模型,像 Grid 这样的控件需要相当多的“自定义”编码才能将回发事件“转换”为 URL 操作,因此与 MVC 网格模板相比,您可能不会节省大量代码。但是,您将在样式上节省大量时间,并且性能差异应该可以忽略不计。
希望有帮助。
-托德
我很确定这些依赖于 WebForms 中的 PostBack 模型,并且与 MVC 视图不兼容。您可能会找到一种让它们工作的方法,但这不符合 MVC 原则。如果需要,您可以在同一个网站中混合/匹配 WebForms 和 MVC 视图,但我不建议这样做。
使用 Telerik 控件将失去的是 MVC 的大部分好处:清晰的关注点分离、增强的可测试性、更精简的 HTML、更简洁的架构。我不会惊讶地发现 Telerik 最终推出了 MVC 控件。现在,如果您需要重用一些通用组件,我会查看客户端的纯 Javascript 实现或手动编码的 ViewUserControls。
就个人而言,我不会将当前的 Telerik 控件与 MVC 一起使用。我认为它们在某些情况下工作(http://telerikwatch.com/2009/01/telerik-mvc-demo-app-now-available.html),但我认为它们非常以视图状态/回发为中心。知道telerik,他们会推出兼容MVC的版本,但看起来他们面前还有很多工作要做......
我意识到这是一个老问题,但Telerik 的 ASP.NET MVC 控件只是控件,如日期选择器、网格、面板栏、标签条。这些都不是 MVC框架的竞争对手。他们与它一起 工作。您的问题告诉我您不了解,或者至少不了解MVC 的真正含义。
为了其他可能感到困惑的人的利益,MVC 代表Model-View-Controller。有一个Model,表示您用于存储或检索值的对象,一个View,它显示这些对象值并可以通过使用控件(例如 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 的演示对它们进行编码,需要对您输入的特定模型和数据进行大量复制/粘贴和各种小编辑(如上所示)。代码也少得多,因为控件几乎所有东西都是内置的,所以当然生产时间会大大减少,过滤、分页、网格排序等东西已经存在——你只需添加说,就可以打开它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()
上面的前 2 行放入一个public Customers_Read([DataSourceRequest] DataSourceRequest request) {}
返回data
为.ToDataSourceResult()
. 更新类似于该函数中的最后 3 行,因为您实例化模型,复制从网格传入的模型中的值,然后执行类似dataContext.SaveChanges()
保存的操作。保存后,网格会自动进行另一次读取,因此它将看到最新的值。无需在回发时运行其他任何东西来重新绑定数据,因此无需编写更多代码。
只需查看此处的代码示例以更好地了解: http ://demos.telerik.com/aspnet-mvc/