2016-03-14 98 views
1

所以我在一個非常大的MVC應用程序中使用viewbag。 (我知道Viewbag並不是那麼棒,但由於顯而易見的原因,我不得不繼續編寫與之前開發者相同的風格)Viewbag更改onclick的值?

今天我偶然發現了一個非常奇怪的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/[email protected]&[email protected]&[email protected]&[email protected]');">@Resources.ButtonCancel</button> 
@ViewBag.IncludeAcknoweldged @*displays true*@ 

我還可以看到真正的把一個斷點接近它的時候。 但在Web瀏覽器的檢查只是顯示:

<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/[email protected]&[email protected]&[email protected]Source&[email protected]"); 
    } 
</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

'IncludeAcknoweldge'如何設置? – rogerdeuce

+0

在控制器中,根據表達式簡單地將其設置爲true或false。我已將該代碼更改爲'ViewBag.Acknoweldged = True;'以查看該部分是否沒有任何問題。 – counterflux

+0

試試'...&[email protected]()&...' –

回答

1

您看到的行爲是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="...&[email protected]()&..." 

需要注意的是你的第二個選項適用的理由是它不在html屬性中進行評估。

您可以在this article中閱讀更多關於條件屬性的內容。

0

使用的括號ViewBag可能做的伎倆: @(ViewBag.IncludeAcknoweldge)

+0

不好意思,仍然是由onclick相同的替代品。 – counterflux

0

使用ViewBag的問題之一是不檢查鍵(沒有編譯時檢查,沒有運行時檢查)。而你似乎可以用幾種不同的拼法爲可能同一個變量:

ViewBag.IncludeAcknoweldge 
ViewBag.IncludeAcknoweldged 

也許固定這將解決問題了嗎?

+0

我在閱讀我的編輯時注意到我在給出其他代碼時犯了一個錯誤。我編輯了IncludeAcknoweldged以確認我的程序中已經看到它與一個不幸的命名無關。我重新檢查拼寫,但一切都很好。此外,即使我拼錯變量,我會得到像「undefined」或「null」而不是「onclick」。 – counterflux