使用ASP.NET MVC的Telerik Controls:这是否违反了MVC模型?

时间:2009-02-04 04:23:26

标签: asp.net-mvc telerik

  1. 将使用MVC enabled Telerik controls ASP.NET MVC违反了MVC模型?

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

5 个答案:

答案 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/