Viewbag 更改 onclick 中的值?

Viewbag changes value in onclick?

所以我在一个相当大的 MVC 应用程序中使用了一个 viewbag。 (我知道 Viewbag 不是那么好,但出于显而易见的原因,我不得不继续以与以前的开发人员相同的风格进行编程)

今天我偶然发现了一个非常奇怪的 viewbag 问题。我试图使用 viewbag 值作为参数在 onclick 函数中调用 javascript 函数。该函数执行重定向,该函数工作正常但由于某种原因我的 viewbag 值发生变化??

IncludeAcknowledged 值在函数中从 True 更改为 onclick

这是我使用的代码(带有一些临时调试工具): html:

@ViewBag.IncludeAcknoweldge @*displays true*@
<button class="btn btn-default" type="button" onclick="javascript:Common.loadUrl('IncidentMonitor/List/?Date=@ViewBag.DateTime&IncludeAcknowledged=@ViewBag.IncludeAcknoweldged&Source=@ViewBag.Source&SourceId=@ViewBag.SourceId');">@Resources.ButtonCancel</button>
@ViewBag.IncludeAcknoweldged @*displays true*@

在其附近放置断点时,我也可以看到 True。 但是在网络浏览器的检查器中它只显示:

<button class="btn btn-default" type="button" onclick="javascript:Common.loadUrl('IncidentMonitor/List/?Date=&amp;IncludeAcknowledged=onclick&amp;Source=&amp;SourceId=');">Annuleren</button>

知道为什么会这样吗?我可能可以变通,但真的很想知道为什么它会这样。

编辑:解决方法是:

<button class="btn btn-default" type="button" onclick='loadUrl()'>@Resources.ButtonCancel</button>
<script>
function loadUrl() {
    javascript:Common.loadUrl("IncidentMonitor/List/Date=@ViewBag.DateTime&IncludeAcknowledged=@ViewBag.IncludeAcknoweldged&Source=@ViewBag.Source&SourceId=@ViewBag.SourceId");
    }
</script>

但仍然想知道解决方法为何正确的答案,同时将函数放在 onclick 中会给出奇怪的 viewbag 值。

编辑2: 根据多次请求,动作的控制器代码......虽然没有太多可看的,因为我从未在其他地方触及我的变量:

[HttpGet]
        [AuthorizeFunctionality(RequestedFunctionality.Editor)]
        public ActionResult Edit()
        {

            try
            {

                var editIncidentEventContainer = new EditIncidentViewModel
                {
                };

                ViewBag.IncludeAcknoweldged = true;

                return View("_Edit", editIncidentEventContainer);
            }
            catch (Exception ex)
            {
                return new RedirectToRouteResult(new RouteValueDictionary{{ "controller", "Error" },
                    { "action", "DisplayMessage" },
                    { "message", ex.Message }});
            }
        }

在 ViewBag 周围使用括号可能会达到目的: @(ViewBag.IncludeAcknoweldge)

使用 ViewBag 的一个问题是不检查键(没有编译时检查,没有运行时检查)。而且您似乎对可能相同的变量使用了几种不同的拼写:

ViewBag.IncludeAcknoweldge
ViewBag.IncludeAcknoweldged

也许解决这个问题就能解决您的问题?

您看到的行为是 MVC-4/Razor-2.0 中添加的称为条件属性的功能的不幸副作用。

在 MVC-4 之前,如果您想手动生成(比方说)一个复选框并根据模型 属性 设置 checked 属性,如果有必要在其中包含杂乱的条件语句设置 checked 属性的标记。使用条件属性,您可以简单地使用

<input type="checkbox" checked="@ViewBag.IsChecked" ... />

如果 IsCheckedtrue 它将输出 checked="checked" 如果 false 属性将被省略。

在 MVC-4+ 中,您现在需要使用 .ToString() 强制剃须刀将值计算为 string 而不是 bool,在您的情况下

onclick="...&IncludeAcknowledged=@ViewBag.IncludeAcknoweldged.ToString()&..."

请注意,您的第二个选项起作用的原因是它没有在 html 属性中进行评估。

您可以在 this article 中阅读有关条件属性的更多信息。