我遇到了我认为是常见的场景,我在其中使用MVC模式(特别是ASP.NET的MVC框架)用于Web应用程序,前端使用AngularJS.我的问题是我有一个特定的值,它是模型的一部分传递给我的视图,我也想让我的Angular控制器的$ scope,理想情况下,一旦控制器被初始化.
如何做到这一点是以前被问及回答的问题.有一个显而易见的候选人:ngInit.然而,在某些时候,Angular更新了他们的文档,似乎是针对这一具体想法的警告:
唯一合适的用途
ngInit是用于别名的特殊属性ngRepeat,如下面的演示中所示.除了这种情况,您应该使用控制器而不是ngInit初始化范围上的值.
建议的替代方案并不十分相关.
当然,还有其他我能想到的解决方法.例如,视图可以将值插入到ngModel隐藏输入的指令中.或者我可以简单地忽略警告并使用ngInit无论如何.但是,我能想到的任何一种方式都是一种更丑陋的方式来做同样的事情ngInit,或者显然更糟.
事实上,对我来说似乎是明显的解决方案显然是错误的,这可能是我的心态与Angular应该如何完成无关的指标.所以我的问题不是"我该如何处理这种情况",而是:
ngInit?澄清,因为从前两个评论来看,这一点并不清楚:这是针对某个或大部分页面直接作为MVC视图提供的情况,只有一些特定的功能由Angular提供.我想传递给Angular控制器的数据已经传递给模型中的视图.我不希望Angular控制器然后去为服务器做自己的get请求,只是为了获得已经以不同格式提供给视图的相同参数.
javascript asp.net-mvc angularjs angularjs-controller ng-init
我将尽我所能详细解释我正在努力实现的目标.
我正在使用带有IntPtr窗口句柄的C#来从我自己的C#应用程序对外部应用程序执行CTRL-C复制操作.我不得不这样做,因为无法使用GET_TEXT直接访问文本.然后我在我的应用程序中使用该副本的文本内容.这里的问题是我现在已经覆盖了剪贴板.
我希望能做的是:
这是我到目前为止尝试的代码:
private void GetClipboardText()
{
text = "";
IDataObject backupClipboad = Clipboard.GetDataObject();
KeyboardInput input = new KeyboardInput(this);
input.Copy(dialogHandle); // Performs a CTRL-C (copy) operation
IDataObject clipboard = Clipboard.GetDataObject();
if (clipboard.GetDataPresent(DataFormats.Text))
{
// Retrieves the text from the clipboard
text = clipboard.GetData(DataFormats.Text) as string;
}
if (backupClipboad != null)
{
Clipboard.SetDataObject(backupClipboad, true); // throws exception
}
}
Run Code Online (Sandbox Code Playgroud)
我使用System.Windows.Clipboard而不是System.Windows.Forms.Clipboard.原因是当我执行CTRL-C时,System.Windows.Forms中的Clipboard类没有返回任何数据,但系统剪贴板却没有.
我查看了一些低级user32调用,如OpenClipboard,EmptyClipboard和CloseClipboard,希望它们可以帮助我这样做,但到目前为止,我一直在尝试恢复时遇到COM异常.
我想也许这与OpenClipboard参数有关,该参数期望一个想要控制剪贴板的应用程序的IntPtr窗口句柄.由于我提到我的应用程序没有GUI,这是一个挑战.我不知道该在这里传递什么.也许有人可以对此有所了解?
我是否错误地使用了Clipboard类?有没有明确的方法来获取没有GUI的应用程序的IntPtr窗口句柄?有谁知道备份和恢复系统剪贴板的更好方法?
我在.NET的Dictionaries实现中挖掘,发现了一个我很好奇的函数:HashHelpers.GetPrime.
它所做的大部分工作都非常简单,它会查找超过某个最小值的素数,并将其作为参数传递给它,显然是出于在哈希表结构中用作多个桶的特定目的.但有一个神秘的部分:
if (HashHelpers.IsPrime(j) && (j - 1) % 101 != 0)
{
return j;
}
Run Code Online (Sandbox Code Playgroud)
(j - 1) % 101 != 0检查的目的是什么?也就是说,为什么我们显然想要避免使用多于101的倍数的多个桶?
public class A
{
protected virtual int X {get; private set;}
}
public class B : A
{
public int Add(A other)
{
return X + other.X;
}
}
Run Code Online (Sandbox Code Playgroud)
因为如果是,你有这个:
public class C : A
{
protected override int X { get { return 4; } }
}
Run Code Online (Sandbox Code Playgroud)
然后:
A c = new C();
B b = new B();
b.Add(c);
Run Code Online (Sandbox Code Playgroud)
这是非法的,因为即使B访问X意味着它知道C具有所需的签名,它仍然不允许实际访问该成员.
到现在为止还挺好.但鉴于上述情况,我很困惑的是为什么我能做到这一点:
public class A
{ …Run Code Online (Sandbox Code Playgroud) 我试图以编程方式运行命令行工具DISM.exe.当我手动运行它时它可以工作,但是当我尝试使用以下代码生成它时:
var systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
var dism = new Process();
dism.StartInfo.FileName = Path.Combine(systemPath, "Dism.exe");
dism.StartInfo.Arguments = "/Online /Get-Features /Format:Table";
dism.StartInfo.Verb = "runas";
dism.StartInfo.UseShellExecute = false;
dism.StartInfo.RedirectStandardOutput = true;
dism.Start();
var result = dism.StandardOutput.ReadToEnd();
dism.WaitForExit();
Run Code Online (Sandbox Code Playgroud)
然后我的result出现:
错误:11
您无法使用32位版本的DISM为正在运行的64位操作系统提供服务.请使用与您的计算机体系结构相对应的DISM版本.
我实际上已经意识到导致这种情况的原因了:我的项目设置为编译x86平台.(例如,请参阅此问题,尽管没有一个答案提到这一点).但是,不幸的是,目前我们仍然需要继续瞄准这个平台,我无法通过切换到任何CPU来解决这个问题.
所以我的问题是如何以独立于其父平台的方式以编程方式生成流程 - 即保持我的项目以x86为目标,但启动一个流程,该流程将针对其所在机器的正确平台.
c# ×4
.net ×2
angularjs ×1
asp.net-mvc ×1
backup ×1
clipboard ×1
dictionary ×1
dism ×1
inheritance ×1
javascript ×1
ng-init ×1
restore ×1