kMVC Nuget 包安装 "methods is null" 错误

kMVC Nuget Package Installation "methods is null" Error

我已经尝试在我们的 Intranet 应用程序中使用 Knockout MVC (kMVC) 几个星期了,但在通过 nuget 安装 kMVC 包时出现错误 ("methods is null")我们现有的和新创建的示例 ASP.NET MVC 4 项目。我在几台不同的机器上尝试过,一台是 VS 2017,另一台是 VS 2019,我仍然收到相同的错误消息。

I have been trying out Knockout MVC (kMVC) for use in our intranet apps for a couple of weeks now and I am getting the error ("methods is null") when installing the kMVC package via nuget.

这个包太旧了(从 2014 年 8 月 12 日起就再也没有更新过)所以它与 VS2015~VS2019 不兼容。

详情:

您可以在您的解决方案目录中找到一个 packages 文件夹,在那里您可以找到 kMVC.0.6.0 文件夹。此文件夹包含 lib 子文件夹中的 PerpetuumSoft.Knockout.dlltools 子文件夹中的 install.ps1

当我们安装该 nuget 包时,nuget 将帮助我们的项目引用该程序集,并自动 运行 powershell 脚本。 method is null 问题由此产生。

查看该 nuget 包中 Install.ps1 的内容:

param($installPath, $toolsPath, $package, $project)

$projectIsVB = $false
try {
    $item = $project.ProjectItems.Item("global.asax").ProjectItems.Item("global.asax.cs")
} catch {
    $item = $project.ProjectItems.Item("global.asax").ProjectItems.Item("global.asax.vb")
    $projectIsVB = $true
}

if ($projectIsVB) {
    $class = $item.FileCodeModel.CodeElements | where-object {$_.Kind -eq 1}
} else {
    $namespace = $item.FileCodeModel.CodeElements | where-object {$_.Kind -eq 5}
    $class = $namespace.Children | where-object {$_.Kind -eq 1}
}

$method = $class.Children | where-object {$_.Name -eq "Application_Start"}
if (!$method)
{
    [system.windows.forms.messagebox]::show("methods is null")
}

$edit = $method.StartPoint.CreateEditPoint();
$edit.LineDown()
$edit.CharRight(1)
$edit.Insert([Environment]::NewLine)
if ($projectIsVB) {
    $edit.Insert("      ModelBinders.Binders.DefaultBinder = new PerpetuumSoft.Knockout.KnockoutModelBinder()")
    $edit.Insert([Environment]::Newline)
} else {
    $edit.Insert("      ModelBinders.Binders.DefaultBinder = new PerpetuumSoft.Knockout.KnockoutModelBinder();")
}

所以如果我们在 MVC 项目中安装这个 nuget 包,它会尝试添加一行 ModelBinders.Binders.DefaultBinder = new PerpetuumSoft.Knockout.KnockoutModelBinder();global.asax.cs 文件中的 Application_Start 方法。

我在 VS2012 中试过了,运行良好,没有任何问题。但在 VS2015~VS2019 中,它会抛出 method is null 警告。我认为这是因为 project system or VS SDK 在这些版本中发生了很大变化,因此 install.ps1 中的代码不能再正常工作了。

以下是针对您的原始问题的一些建议:

1.You可以尝试联系作者询问他们是否打算更新此包以支持VS2017~VS2019。

2.It只是作者的一条小消息,它实际上不会影响你的项目中的任何东西。(它不会影响你的构建或开发)所以你可以轻松地忽略这个消息框。

install.ps1 想要做的就是将 ModelBinders.Binders.DefaultBinder = new KnockoutModelBinder(); 添加到 Application_Start 方法,因此只需忽略警告并手动添加此行即可。

As for your another issue How do I set the default binder to both?

line2 将覆盖 Application_Start 方法中的 line1,因此只有 line2 在这种情况下有效。并找到一个解决方法来设置它们(与编码相关),我建议您可以打开一个包含更多详细信息的新线程,因为它与您的原始问题无关(与 nuget 包相关)。请避免在一期中提出两个不同的问题。

希望以上对大家有所帮助:)