JavaScript 空合并运算符 ??导致 .NET JS 压缩器/捆绑器崩溃

问题描述 投票:0回答:1

我的代码中的以下行导致 MVC 内置捆绑器/压缩器崩溃。问题在于

??
运算符。如果我注释掉这一行或删除运算符,一切都会正常。我该如何解决这个问题?

span.textContent = typeof (info) === 'object' ? info.column.caption ?? info.column.dataField : info;

这是它抛出的错误消息:

[NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.]
   Microsoft.Ajax.Utilities.JSParser.ParseExpression(AstNode leftHandSide, Boolean single, Boolean bCanAssign, JSToken inToken) +820
   Microsoft.Ajax.Utilities.JSParser.ParseExpression(AstNode leftHandSide, Boolean single, Boolean bCanAssign, JSToken inToken) +654
   Microsoft.Ajax.Utilities.JSParser.ParseExpression(AstNode leftHandSide, Boolean single, Boolean bCanAssign, JSToken inToken) +654
   Microsoft.Ajax.Utilities.JSParser.ParseExpressionStatement(Boolean fSourceElement) +147
   Microsoft.Ajax.Utilities.JSParser.ParseStatement(Boolean fSourceElement, Boolean skipImportantComment) +1474
   Microsoft.Ajax.Utilities.JSParser.ParseFunctionBody(Block body) +43
   Microsoft.Ajax.Utilities.JSParser.ParseFunction(FunctionType functionType, Context fncCtx) +1077
   Microsoft.Ajax.Utilities.JSParser.ParseStatement(Boolean fSourceElement, Boolean skipImportantComment) +905
   Microsoft.Ajax.Utilities.JSParser.ParseFunctionBody(Block body) +43
   Microsoft.Ajax.Utilities.JSParser.ParseFunction(FunctionType functionType, Context fncCtx) +1077
   Microsoft.Ajax.Utilities.JSParser.ParseLeftHandSideExpression(Boolean isMinus) +2626
   Microsoft.Ajax.Utilities.JSParser.ParseUnaryExpression(Boolean& isLeftHandSideExpr, Boolean isMinus) +1090
   Microsoft.Ajax.Utilities.JSParser.ParseExpressionList(JSToken terminator) +408
   Microsoft.Ajax.Utilities.JSParser.ParseMemberExpression(AstNode expression, List`1 newContexts) +106
   Microsoft.Ajax.Utilities.JSParser.ParseLeftHandSideExpression(Boolean isMinus) +3074
   Microsoft.Ajax.Utilities.JSParser.ParseUnaryExpression(Boolean& isLeftHandSideExpr, Boolean isMinus) +1090
   Microsoft.Ajax.Utilities.JSParser.ParseExpressionStatement(Boolean fSourceElement) +41
   Microsoft.Ajax.Utilities.JSParser.ParseStatement(Boolean fSourceElement, Boolean skipImportantComment) +1474
   Microsoft.Ajax.Utilities.JSParser.ParseStatements(Block block) +76
   Microsoft.Ajax.Utilities.JSParser.InternalParse() +830
   Microsoft.Ajax.Utilities.Minifier.MinifyJavaScript(String source, CodeSettings codeSettings) +805
   System.Web.Optimization.JsMinify.Process(BundleContext context, BundleResponse response) +115
   System.Web.Optimization.Bundle.ApplyTransforms(BundleContext context, String bundleContent, IEnumerable`1 bundleFiles) +325
   System.Web.Optimization.Bundle.GetBundleResponse(BundleContext context) +59
   System.Web.Optimization.BundleResolver.GetBundleContents(String virtualPath) +213
   System.Web.Optimization.AssetManager.DeterminePathsToRender(IEnumerable`1 assets) +421
   System.Web.Optimization.AssetManager.RenderExplicit(String tagFormat, String[] paths) +34
   ASP._Page_Views_Work_Index_cshtml.Execute() in C:\dev\DE.ZA.TrailerLoading\DE.ZA.TrailerLoadingAssistant.Web\Views\Work\Index.cshtml:152
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +252
   System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +148
   System.Web.WebPages.StartPage.ExecutePageHierarchy() +86
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +107
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +378
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +91
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +795
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +795
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +81
   System.Web.Mvc.Async.<>c__DisplayClass3_1.<BeginInvokeAction>b__1(IAsyncResult asyncResult) +188
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +38
   System.Web.Mvc.<>c.<BeginExecuteCore>b__152_1(IAsyncResult asyncResult, ExecuteCoreState innerState) +29
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +73
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +52
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +39
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +38
   System.Web.Mvc.<>c.<BeginProcessRequest>b__20_1(IAsyncResult asyncResult, ProcessRequestState innerState) +43
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +73
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +38
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +651
   System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +220
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +134
javascript asp.net .net asp.net-mvc bundling-and-minification
1个回答
0
投票

我没有解决办法,但我可以提供解决方法。可以使用

||
(或运算符)。如果
info.column.caption
计算为
false
,则计算
info.column.dataField
并将其用作组合表达式的值。

我根据你的问题创建了一些测试用例。

let info;
let textContent;

info = "test 1 info";
textContent = typeof (info) === 'object' ? info.column.caption || info.column.dataField : info;
console.log(textContent);

info = { column: { caption: "test 2 caption", dataField: "test 2 dataField" } };
textContent= typeof (info) === 'object' ? info.column.caption || info.column.dataField : info;
console.log(textContent);

info = { column: { caption: "", dataField: "test 3 dataField" } };
textContent = typeof (info) === 'object' ? info.column.caption || info.column.dataField : info;
console.log(textContent);

info = { column: { dataField: "test 4 dataField" } };
textContent = typeof (info) === 'object' ? info.column.caption || info.column.dataField : info;
console.log(textContent);

此日志:

测试1信息

测试2标题

测试3个数据字段

测试4个数据字段

请注意,如果

info.column.caption
是空字符串(测试用例 3),它也将计算为
false
,这可能是理想的,也可能不是。

© www.soinside.com 2019 - 2024. All rights reserved.