所以我在一个相当大的 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=&IncludeAcknowledged=onclick&Source=&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" ... />
如果IsChecked
为true
,它将输出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/