javascript - Viewbag 改变 onclick 中的值?

标签 javascript asp.net-mvc viewbag

所以我在一个相当大的 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: 根据多次要求,操作的 Controller 代码...尽管没有太多可看的,因为我从未在其他地方接触过我的变量:

[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 }});
            }
        }

最佳答案

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

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

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

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

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

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

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

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

关于javascript - Viewbag 改变 onclick 中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35987832/

相关文章:

javascript - MeteorJS 和 IoT 空间

javascript - 通过 jquery/ajax 使用谷歌地图地理编码从纬度/经度获取城市/州?

javascript - 如何从 View (MVC) 上的输入控件获取值

javascript - 如何使用 jquery/javascript 从 ontextchanged 事件获取文本框值

asp.net-mvc-3 - 使用 ASP.NET MVC 3 中的 ViewBag 从 Controller 传递图像并显示在 View 中

c# - 如何将 viewbag 显示为 html?

javascript - 目前是否有将两个或多个字符串文字类型连接到 TypeScript 中的单个字符串文字类型的方法?

javascript toFixed()

javascript - 迭代 JSON 对象并收集模型值

jquery - 使用 qTip jQuery 插件进行 ASP.NET MVC 验证