kMVC Установка пакета Nuget "методы нулевые" Ошибка - PullRequest
0 голосов
/ 06 ноября 2019

Я уже несколько недель пытаюсь использовать Knockout MVC (kMVC) для использования в наших приложениях для интрасети, и я получаю сообщение об ошибке ("method is null") при установке пакета kMVC через nuget на все наши существующиеи недавно созданные примеры проектов ASP.NET MVC 4. Я пробовал это на нескольких разных машинах, одна с VS 2017, а другая с VS 2019, я все еще получаю то же сообщение об ошибке.

1 Ответ

1 голос
/ 07 ноября 2019

Я уже несколько недель пытаюсь использовать Knockout MVC (kMVC) для использования в наших приложениях для интрасети, и я получаю сообщение об ошибке ("method is null") при установке пакета kMVC через nuget.

Этот пакет слишком старый (никогда не обновляется с 12/12/2014), поэтому он не совместим с VS2015 ~ VS2019.

Подробности:

Вы можете найти папку packages в вашем каталоге решений, там вы можете найти папку kMVC.0.6.0. Эта папка содержит подпапку PerpetuumSoft.Knockout.dll в lib и install.ps1 в подпапке tools.

Когда мы устанавливаем этот пакет nuget, nuget поможет нашему проекту ссылаться на эту сборку, изапустить скрипт powershell автоматически. В результате возникает проблема method is null.

Смотрите содержимое Install.ps1 в этом пакете nuget:

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();")
}

Так что, если мы установим этот пакет nuget в проект MVC, он попытаетсядобавьте одну строку ModelBinders.Binders.DefaultBinder = new PerpetuumSoft.Knockout.KnockoutModelBinder(); к Application_Start методу в global.asax.cs файле.

Я попробовал это в VS2012, он работает без проблем . Но в VS2015 ~ VS2019 выдает предупреждение method is null. Я думаю, это потому, что project system or VS SDK сильно изменился в этих версиях, поэтому код в install.ps1 не может больше работать.

Вот несколько советов к вашей первоначальной проблеме:

1.Вы можете попытаться связаться с автором, чтобы узнать, планируют ли они обновить этот пакет для поддержки VS2017 ~ VS2019.

2. Это всего лишь небольшое сообщение от авторана самом деле это ничего не повлияет на ваш проект (это не повлияет на вашу сборку или разработку). Таким образом, вы можете легко проигнорировать это окно сообщения.

И все, что install.ps1 хочет сделать, это добавить ModelBinders.Binders.DefaultBinder = new KnockoutModelBinder(); к методу Application_Start, так что просто проигнорируйте предупреждение и добавьте эту строку вручную.

Что касается другогопроблема How do I set the default binder to both?

line2 будет охватывать line1 в методе Application_Start, поэтому в этой ситуации работает только строка 2. И чтобы найти обходной путь для установки их обоих (связанных с кодированием), я предлагаю вам открыть новый поток с более подробной информацией, поскольку он не связан с вашей исходной проблемой (связанной с пакетом nuget). Пожалуйста, не задавайте два разных вопроса в одном выпуске.

Надеюсь, что все вышесказанное поможет вам :)

...