【问题标题】:Issue passing Kendo UI grid model via Viewbag通过 Viewbag 传递 Kendo UI 网格模型的问题
【发布时间】:2015-04-09 13:55:33
【问题描述】:

我已经定义了剑道网格剃刀:

@(Html.Kendo().Grid<MyApp.Models.FolderName.Whatever>()
    .Name("grid")
    ...
    ...

由于我试图创建可重复使用的页面,我需要在控制器中定义网格模型并通过 ViewBag 传递它。

@(Html.Kendo().Grid<ViewBag.myModel>()
    .Name("grid")
    ...
    ...

但是上面的尝试失败了:

它不需要通过 ViewBag,但我需要以其他方式定义模型。

【问题讨论】:

  • 您是想将此网格绑定到 T 类型的模型或具有不同属性的潜在动态对象,还是与您的场景中应用于网格的模型相同?
  • @DavidShorthose,它是一个具有相同属性和方法但位于不同文件夹中的模型。它们具有相同的结构,但填充方式有点不同
  • @chiapa 对我来说听起来像是一个设计问题。将相同的实体分离到不同的位置并不是 DRY(不要重复自己)。如果您有多个共享相同属性和方法的数据类型(模型),则应使用继承。
  • @Brett,它们非常相似但不一样。每个都有从不同的 Web 服务获取数据的方法。它们拥有的属性 90% 相同,可以通过继承解决,但方法确实指向不同的 Web 服务端点,继承无法解决。
  • @chiapa 这并不完全正确。同样,通过正确的设计决策,您可以对方法使用继承。例如,您不能将 Web 服务连接参数作为参数传递给方法吗?这样你就有了一个可以访问任何 Web 服务并且很容易继承的方法。

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


【解决方案1】:

我会将强类型模型传递给 Razor 视图以避免强制转换。

@model IEnumerable<MyModel>

然后它会像

@(Html.Kendo().Grid<MyModel>()    
 .Name("grid")
 ... 

如果你想坚持 ViewBag 方法,那么你将不得不转换数据

 @(Html.Kendo().Grid((IEnumerable<MyModel>)ViewBag.myModel)
.Name("Grid")
 ...

Telerik 已经很好地记录了这一点。你可以找到它here

请注意这里的MyModel 是强类型的。

编辑

基于 cmets,看看这是否对你有帮助。我的猜测是你有一些常见的属性可以放在下面的基类中

public class BaseModel
{
  public string PropertyOne{get;set;}
  public string PropertyTwo{get;set;} 
}

然后创建如下子模型:

public class WhateverModel:BaseModel 
{

}
public class MyModel:BaseModel 
{

}

现在,您可以在ViewBag.myModel 中收集WhateverModelMyModel

您的视图代码如下所示:

@(Html.Kendo().Grid((IEnumerable<BaseModel>)ViewBag.myModel)
.Name("Grid")
...

这就是您可以将任何模型集合传递到您的 ViewBag.myModel 的方式,只要该模型继承自 BaseModel

我希望这会有所帮助。

【讨论】:

  • 感谢您的回答。我试过@(Html.Kendo().Grid((IEnumerable&lt;MyApp.Models.FolderName.Whatever&gt;)ViewBag.myModel),但问题仍然存在。我有多个具有相同名称的模型,要访问我想要的模型,我必须在它前面加上包含它的文件夹 - 必须动态定义
  • “我有多个具有相同名称的模型并且要访问我想要的模型,我必须在它前面加上包含它的文件夹”是什么意思?它们是否将具有相同的属性但类型名称不同?我有一个解决方案,但我需要回答这些问题才能正确更新我的答案。
  • @chiapa 你似乎很困惑。你确实意识到MyApp.Models.FolderName 是一个命名空间,Whatever 是数据类型,对吧?仅仅因为您的项目文件夹模仿了您的命名空间方案,这只是巧合。命名空间可以是任何你想要的。我也对“多个模型......同名”的意思感到困惑。你是说你有多个名为Whatever 的数据类型并且每个都有不同的命名空间?
【解决方案2】:

我认为您的设计存在缺陷,您根本不应该使用 viewbag。

我个人不喜欢直接将数据传递给视图,而 Kendo Grid 本身完全能够检索数据。这可以像你想要的那样通用。

如果您有具有相同结构的不同模型,但填充方式不同,您应该将它们组合成一个可重复使用的通用模型。

@(Html.Kendo().Grid<MyApp.Models.GenericModel>()
    .Name("grid")
    .DataSource(ds => ds.Read("GetGenericData", "Home", new { someParameter })
    ...
)

【讨论】:

  • 它们是分开的,因为每个都非常大,并且它们与解决方案中的不同模块相关。此外,每个都有获取数据 Web 服务的方法,但对于来自不同来源的数据具有不同的端点。创建一个集合所有其他模型的模型会创建一个巨大的模型,我想避免这种情况。为此,我可以创建另一个指向我想要的模型的视图
  • @chiapa 我知道您可能已经厌倦了我提出这个问题,但是,继承将解决您刚刚提出的所有问题。
【解决方案3】:

语法应该是这样的

    @(Html.Kendo().Grid((IEnumerable<MyApp.Models.FolderName.Whatever>)ViewBag.myModel)

【讨论】:

  • 感谢您的回答,但这样我仍然必须编写整个路径 - 例如,我希望它是动态的并将其作为 ViewBag 传递
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多