ReSharper:"Condition is always false" 从 .jQuery 中的 ViewBag 读取值时发出警告

ReSharper : "Condition is always false" warning when reading value from ViewBag in .jQuery

我正在为控制器中的 ViewBag 分配一些值,并在 View 中的 jQuery 中读取它。我可以看到该值,但是当我添加一些条件时,ReSharper 总是显示 Condition is always 'false' 警告。这是为什么?

控制器:

public ActionResult ViewQueue(int? id)
{
    try
    {
        ViewBag.ConceptId = id;
    }
    catch (Exception ex)
    {
        Logger.Error("Error");
        throw new Exception("Error occured, Error: " + ex.Message);
    }
}

查看:

$(function () {
    $('a[id="CancelJob"]').click(function (event) {

    var conceptId = '@ViewBag.ConceptId';

    alert("conceptId " + conceptId); // Getting id here.

    if (conceptId == null) { // Seeing warning here.
        // TODO: Get conceptId from somewhere else if conceptId is null or undefined.
    }
});

我也试过以下但结果相同:

   // using identity operator
    if (conceptId === null) {
    }

    // Checking 'truthy'
    if (conceptId) {
    }

这里的问题是您在混合 null 概念。服务器上的 Null 与客户端上的 null 不同。或者,来自 C#nullJavascript 上的 null 不同。

让我稍微解释一下:

查看您的操作签名:public ActionResult ViewQueue(int? id),如果您不在路线上传递 id,它将被设置为 null,感谢默认参数功能 C# 4.0 在 2010 年回归并为 ASP.NET MVC 启用了这个有趣的场景。

假设我们在第一次调用时传递了一个 id:

http://localhost:12345/Ctrl/ViewQueue/5

例如,如果您使用 Chrome 开发人员工具检查在客户端生成的代码,您会看到分配 conceptId 变量的代码行:

var conceptId = '@ViewBag.ConceptId';

它现在已经在客户端被翻译成这样:

var conceptId = '5';.

表达式在 razor 视图渲染期间在服务器端进行了评估,并且 conceptId 的值分配正常。

到目前为止,还不错。

现在让我们试试不带参数。我们调用 http://localhost:12345/Ctrl/ViewQueue 从而将参数设置为空。

如果您再次检查为您的视图生成的代码,您会看到一些有趣的东西:

var conceptId = '';

您的行现在已被转换为空字符串赋值,这就是 Reshaper 告诉您的内容:这不可能是 null。曾经。

希望对您有所帮助!