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