【发布时间】:2015-06-21 05:02:18
【问题描述】:
我在 ASP.NET MVC 5 中有一个使用动态模型的 View (vbhtml),我知道在 C# 中通过编写很容易做到这一点
@model dynamic
但是如何在 vbhtml 中指定呢?
【问题讨论】:
标签: asp.net-mvc vb.net razor
我在 ASP.NET MVC 5 中有一个使用动态模型的 View (vbhtml),我知道在 C# 中通过编写很容易做到这一点
@model dynamic
但是如何在 vbhtml 中指定呢?
【问题讨论】:
标签: asp.net-mvc vb.net razor
在 vb.net 中没有 C# Dynamic 等效项,您可以将 dynamic 替换为 Object 并确保设置了 option strict off。
dynamic 关键字为 C# 带来了 Option Strict Off 等效功能。
【讨论】:
基于MSDN的关键区别是:
如果对实现了 IDynamicMetaObjectProvider 接口,Visual Basic 绑定到 使用该接口的动态对象。如果进行了后期绑定呼叫 到不实现 IDynamicMetaObjectProvider 的对象 接口,或者如果调用 IDynamicMetaObjectProvider 接口 失败,Visual Basic 使用后期绑定绑定到对象 Visual Basic 运行时的功能。
既然你提到了:
问题在于后期绑定而不是选项严格
您通过使用后期绑定来引用dynamic 对象。在 C# 中,您将后期绑定对象的类型指定为 dynamic。在 Visual Basic 中,您将后期绑定对象的类型指定为 Object。有关详细信息,请参阅dynamic (C# Reference) 和 Early and Late Binding (Visual Basic)。
您可以使用System.Dynamic 命名空间中的类创建自定义dynamic 对象。例如,您可以创建一个ExpandoObject 并在运行时指定该对象的成员。您还可以创建自己的继承 DynamicObject 类的类型。然后,您可以覆盖 DynamicObject 类的成员以提供运行时动态功能。
可以在MSDN 中找到一个示例。
更新:
VB binder 不适用于在中等信任下键入为 dynamic 的内容。尝试将您的应用设置为完全信任。此外,Option Strict On 不允许在 VB.Net 中进行后期绑定。如果您尝试使用像 Html.EditorFor 这样的强类型帮助器,而您的视图不是强类型的类,那么您需要在 @Page 定义中指明模型类型:
<%@ Page
Language="VB"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage(Of YourApplication.YourModelClass)" %>
那么你就可以安全地使用这些辅助方法了。
【讨论】:
@Html.TextBoxFor(Function(x) x.Id) 其中Id 在运行时绑定!如果我使用ExpandoObject,它将导致设计时错误,告诉Id 不是ExpandoObject 的成员,DynamicObject 也会发生这种情况。我要做的就是根据我的模型动态创建我的视图,模型本身是动态的,由从数据库中检索到的信息创建。看来我应该寻找另一种方式 mohandes ;)
Html.EditorFor,而你的视图不是强类型的类?请查看我的更新。
C# Razor 中 @model 动态的 VB 等效为 @ModelType
【讨论】: