经过一系列不同的文章,没有找到任何特别结论,让我一步一步地完成整个过程,我来寻求帮助.
情景
我的客户只是精通ASP Classic的开发.他们最近为最初用ASP.NET编写的网站获得了一个帐户.他们将网站滚动到他们可以积极维护的东西,但该网站最初包括一个图像处理程序,该图像处理程序采用动态变化的水位数据并输出包含该数据的图形表示的图像.要求是开发一个COM互操作库,该库可以在服务器上注册并使用CreateObject调用,以使用Response.BinaryWrite生成相同图像的字节数组以进行输出.COM互操作库必须在Windows 2000 Server上的远程站点注册,我不能对他们有权访问regasm/gacutil来完成该任务做出任何假设.
难度
我通过在Visual Studio 2010中创建一个类库项目,从模板中选择"COM类",并插入我的代码来生成一个具有单个公共方法的类来构建类库,以便在给定整数时返回一个字节数组(好吧,普查员,但都是一样的).不幸的是,即使在我自己的开发机器上构建库并注册(regasm)和缓存程序集(gacutil)之后,我也无法通过Classic ASP调用实例化对象,而是接收" ActiveX组件无法创建"对象"错误.当然,在服务器站点,DLL文件无法注册,响应为"找不到必需的模块".
我用过的资源
我已经浏览了以下文章,并没有找到我需要的答案:
我需要的
基本上我需要的是一步一步掌握在Visual Studio 2010中正确地满足要求和正确创建COM +互操作模块的过程.创建实际的类对象本身并不是非常糟糕的难.
但是,我查看的文章中没有一篇真正讨论项目选项或使用Visual Studio 2010或.NET 4.0 Framework构建过程,如果对部署到Windows Server 2000等旧系统有特殊注意事项,也没有真正讨论过这些文章.以及只在手头有regsvr32的系统上实际注册库.
我目前的目标是使用程序集中的实用程序为基于域安全组的ASP.NET应用程序实现只读角色提供System.DirectoryServices.AccountManagement
程序.我有以下代码在我的开发域中正常工作,但在部署环境中失败:
Using myContext As New PrincipalContext(ContextType.Domain, Nothing, "DC=My,DC=Controller", accountName, accountPassword)
Try
Dim p As UserPrincipal = UserPrincipal.FindByIdentity(myContext, IdentityType.SamAccountName, userName)
Dim groups = p.GetAuthorizationGroups()
For Each g In groups
Debug.WriteLine("Found security group: " & g.DisplayName & vbNewLine)
Next
Catch ex As Exception
Debug.WriteLine("Encountered an exception: " & vbNewLine & ex.ToString())
End Try
End Using
Run Code Online (Sandbox Code Playgroud)
异常堆栈跟踪返回如下:
System.DirectoryServices.AccountManagement.PrincipalOperationException: There is no such object on the server. ---> System.DirectoryServices.DirectoryServicesCOMException (0x80072030): There is no such object on the server. at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) at …
我刚刚遇到上下文菜单的一个严重问题,我几个小时都无法解决.
为了重现这个问题,我在Visual Studio 2012中使用Windows Phone 8的应用程序模板创建了一个全新的Panorama应用程序.我通过nugget安装了Windows Phone工具包,并在绑定到Items的第一个长列表选择器的数据模板中添加了上下文菜单
<StackPanel Margin="0,-6,0,12">
<TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" FontSize="{StaticResource PhoneFontSizeExtraLarge}"/>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="{Binding LineOne}" Click="MenuItem_Click_1" Tag="{Binding}">
</toolkit:MenuItem>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
我将标题设置为LineOne属性以便于调试.我附上了以下事件:
private void MenuItem_Click_1(object sender, RoutedEventArgs e)
{
var itemViewModel = (ItemViewModel)((MenuItem)sender).Tag;
App.ViewModel.Items.Remove(itemViewModel);
App.ViewModel.Items.Add(new ItemViewModel { LineOne = "Test", LineTwo = "Test", LineThree = "Test" });
}
Run Code Online (Sandbox Code Playgroud)
我运行应用程序并使用上下文菜单删除第一个项目.第一个项目消失,名为Test的新项目按预期显示在列表底部.如果我持有这个新项目,则菜单项被绑定到"runtime one"(已删除的项目).
这是我可以重现错误的最简单的代码,但在我的真实应用程序中,我有相同的问题,更有意义的代码用于在不同的方法甚至不同的页面中添加和删除.我有一个命令绑定,但由于数据绑定错误,命令在错误的视图模型中使用错误的参数运行.
知道为什么会这样吗?
我正在创建一个自定义服务器控件来为我的Web窗体应用程序生成带有特定标记和JavaScript处理程序的按钮元素.当然,它们能够导致回发,因此我希望它们能够与ASP的任何验证控件一起使用,以进行表单验证,尤其是客户端框架.
此按钮服务器控件支持使用提供的代码在按钮标记中OnClientClick
发出onclick
属性的属性(主要用于当用户单击列表视图的删除按钮或类似时的简单确认重新提示),因此使用asp:Button
控件的方法发出验证脚本作为onclick属性将非常无效.事实上,在标准上指定两者OnClientClick
和ValidationGroup
属性asp:Button
结果非常糟糕.这是一个非常明显的例子,说明为什么不能开箱即用:
页面标记
<asp:Button ID="btnSaveAsp" ValidationGroup="vgMyValidationGroup" OnClientClick="return true;" runat="server" />
Run Code Online (Sandbox Code Playgroud)
呈现标记
<input type="submit" name="ctl00$cphBodyContent$lvMyList$ctrl0$btnSaveAsp" value="Save" id="cphBodyContent_lvUsers_btnSaveAsp_0"
onclick='return true; WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphBodyContent$lvMyList$ctrl0$btnSaveAsp", "", true, "vgMyValidationGroup", "", false, false))'>
Run Code Online (Sandbox Code Playgroud)
以下是现有的非工作代码,用于通过验证对控件进行连接.除了发出类似的onclick
属性之外,我无法找到关于如何使用方法实现此目的的更多文档.我认为我Page.ClientSCript.RegisterForEventValidation
在重写AddAttributesToRender
方法中的调用将连接客户端验证,但这似乎没有像我假设的那样起作用.如有必要,jQuery可用于绑定对按钮的click事件的附加处理:
自定义服务器按钮控件
<ToolboxData("<{0}:Button runat=server></{0}:Button>")> _
<ParseChildren(False)> _
<PersistChildren(True)> _
Public Class Button
Inherits System.Web.UI.WebControls.WebControl
Implements IPostBackDataHandler
Public Sub New()
MyBase.New(HtmlTextWriterTag.Button)
End Sub
<Category("Behavior")> _
<DefaultValue("")> _
Public Overridable Property PostBackUrl As String
Get
Return If(ViewState("PostBackUrl"), String.Empty) …
Run Code Online (Sandbox Code Playgroud) asp.net validation webforms custom-server-controls clientscriptmanager
我想将控制器动作与系统的其他元素完全隔离,因为它是遗留代码的重构,因此可以在系统的各个位置呈现动作.为了隔离局部视图模型中属性名称的任何重叠,我希望在表单名称属性前加上一定的值,并使用BindAttribute来指示ModelBinder将模型属性与适当的前缀表单字段进行匹配.
由于我有一些使用这个模型的动作,我希望我可以将[Bind]装饰器直接放在模型类本身上,避免必须装饰进入每个动作的每个模型参数.但是,这种方法似乎没有注册到绑定器,所以我最终得到了无人居住的属性.另一方面,如果我将装饰器移动到参数,一切都很好.
BindAttribute的文档表明它可以在类上使用.这不是支持的方案吗?
.net ×2
asp.net ×2
.net-3.5 ×1
.net-4.0 ×1
asp-classic ×1
com-interop ×1
silverlight ×1
validation ×1
vb.net ×1
webforms ×1