所以我在一个非常大的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=&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值。
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 }});
}
}
答案 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
或许解决这个问题可以解决您的问题?