Viewbag在onclick上改变了价值?

时间:2016-03-14 12:41:20

标签: javascript asp.net-mvc viewbag

所以我在一个非常大的MVC应用程序中使用了一个视图包。 (我知道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值。

EDIT2: 根据要求多次执行动作的控制器代码...虽然没有太多要看,因为我从未在其他地方碰过我的变量:

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

3 个答案:

答案 0 :(得分:1)

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

在MVC-4之前,如果你想手动生成(比方说)一个复选框并根据模型属性设置checked属性,如果需要在标记中包含凌乱的条件语句来设置{ {1}}属性。使用条件属性,您只需使用

即可
checked

如果<input type="checkbox" checked="@ViewBag.IsChecked" ... /> IsChecked,则会输出true,如果checked="checked",则会省略该属性。

在MVC-4 +中,您现在需要使用false强制razor将值评估为.ToString()而不是string,在您的情况下

bool

请注意,第二个选项有效的原因是它未在html属性中进行评估。

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

答案 1 :(得分:0)

在ViewBag周围使用括号可能会起到作用: @(ViewBag.IncludeAcknoweldge)

答案 2 :(得分:0)

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

ViewBag.IncludeAcknoweldge
ViewBag.IncludeAcknoweldged

或许解决这个问题可以解决您的问题?