簡體   English   中英

MVC 3 Razor View:從布爾模型值生成JavaScript

[英]MVC 3 Razor View: Generating JavaScript from a boolean model value

我正在使用ASP.Net MVC 3 Razor視圖引擎。

我需要根據View Model中的值在View中生成一些JavaScript代碼。 我需要使用的值是布爾值,對於此示例,我們將其稱為IsSet

所以我想要做的是創建一個基於此值的JavaScript布爾值,稍后我可以在腳本中使用它。

請記住,對於以下所有示例,我在我的視圖頂部都有這些代碼...

@{ string IsSet = Model.IsSet  ? "true" : "false"; }

注意 :以下所有示例均為JavaScript。

第一次嘗試 ......

var IsSet = @(IsSet);

...這實際上有效, 問題是由於格式錯誤的JavaScript, 它會破壞 VS 2010中的自動格式化 (CTRL + E,D) - 正如您所料,這是不可接受的。

第二次嘗試 ......

var IsSet = "@(IsSet)";

...我知道,JavaScript很聰明,它會在需要時自動解析我的字符串。 哎呀,忘了它是一個字符串類型,除了空之外的任何東西都評估為true。

第三次嘗試 ......

var IsSet = Boolean("@(IsSet)");

....肯定這會工作...不,再次將非空字符串轉換為true(糟糕的解析器!)

第四次嘗試 ......

var IsSet = "@(IsSet)" === "true";

最后一些有用的東西,但它對我來說並不好看。

如果需要我會使用它,但最終我的問題是:有沒有更好的方法來處理這種情況? 也許,我第一次嘗試中的不受歡迎的行為只是微軟可能忽略的事情?

如果有人對我進行了第五次嘗試,那就太好了。

對我來說重要的是VS 2010中的自動格式化不會中斷

謝謝

我剛剛用同樣的問題摔了一個小時。 我的最終解決方案相當於以下內容。

var IsSet = @(Model.IsSet.ToString().ToLower()); // Inside JavaScript block

這不需要額外的代碼。

到目前為止所顯示的版本(在問題和答案中都沒有)是我將要使用的。 我是這樣做的:

@model MyViewModel
<script type="text/javascript">
    var isSet = @Html.Raw(Json.Encode(Model.IsSet));

    // TODO: use the isSet javascript variable here as a standard boolean value
</script>

或者如果您需要使用javascript操作視圖模型的其他屬性,您可以對整個模型進行JSON編碼:

@model MyViewModel
<script type="text/javascript">
    var model = @Html.Raw(Json.Encode(Model));

    if (model.IsSet) {
        alert(model.FooBar);
    }
</script>

版本1是我投票的唯一一個,即使它們都有效,因為它是最人性化的。 不幸的是我家里沒有VS所以我無法嘗試看看自動格式化問題是什么,但如果可能的話我想忽略這個問題並繼續使用那個版本,因為那里有代碼沒有什么問題 - 只是VS很困惑。 (你是說VS試圖將整個事物解釋為JS,從而發現它無效?)

但如果你想要一些其他的選擇:

第五次嘗試......

@{ string IsSet = Model.IsSet  ? "true" : ""; }

var isSet = !!"@(IsSet)";
// OR
var isSet = Boolean("@(IsSet)");

使用舊的雙非運算符技巧將字符串值強制轉換為布爾值 - 正如您已經指出的那樣,“true”和“false”都將成為現實,但如果使用“true”和“”(空,則此問題會消失) string) - 所以你可以根據你的“第三次嘗試”使用Boolean()

第六次嘗試......

@{ string IsSet = Model.IsSet  ? "true" : "false"; }

// helper function at the top of your page:
function bool(strVal) {
   return strVal === "true";
}

// variable declaration
var isSet = bool("@(IsSet)");

好的,所以你最終在頁面的頂部有一個相當無意義的函數,但它保持實際的變量聲明合理整潔,如果調試客戶端你會看到bool("false")bool("true")

第七次嘗試......

我不喜歡創建服務器端string IsSet = Model.IsSet ? "true" : "false";的額外步驟string IsSet = Model.IsSet ? "true" : "false"; string IsSet = Model.IsSet ? "true" : "false"; 提前。 我不知道Razor語法,但你能說出一些基本的話:

var isSet = !!"@(Model.IsSet ? "true" : "")";
// OR, better:
var isSet = !!"@(rzrBool(Model.IsSet))";
// where rzrBool() is a server-side helper function (that you would create)
// which returns "true" or ""

我希望我的所有“嘗試”都有效,但我認為你的“第一次嘗試”是最好的選擇。

怎么樣:

@Ajax.ToJson(Model.IsSet)
var isSet = /true/i.test('@Model.IsSet');
  • 單線
  • 處理.Net和JavaScript之間的區別
  • 使用自動格式化(Visual Studio和帶有Resharper的Visual Studio)
  • 如果您熟悉JavaScript正則表達式,則合理慣用
  • 對邏輯錯誤具有相當的彈性; 它應該按預期執行或拋出JavaScript錯誤(或可能是Razor編譯錯誤)。

這是我在javascript塊中使用的內容:

var someValue;
@{ var someValue= "someValue= " + Model.SomeValue+ ";"; }
@someValue

我知道這是一個老問題,但沒有一個答案特別優雅。

在這些情況下最簡單的解決方案就是將+0附加到條件。 這會隱式地將bool轉換為int,但由於結果為01因此if語句會立即將其轉換回來。 例:

// The space is optional
if (@IsSet +0) {
    // Do stuff
}

為變量賦值布爾值可以如下實現:

// Note the double (not triple) equals, which performs type conversion
var isSet = @IsSet+0 == true;

代碼工作,你沒有紅色波浪線,Visual Studio格式化程序很高興。

怎么樣:

@Model.IsSet.ToString().ToLower()
var isSet= @((bool)Model.IsSet?"true":"false");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM