5
//CHECK IF WE SHOULD SHOW THE PASSWORD HINT OR NOT
Setting passwordhints;

using (var db = new dbDataContext())
{
    passwordhints = (from c in db.Settings
            where c.Name == "ShowPasswordHints" && c.ID == _ID
            select c).FirstOrDefault();
}

if (passwordhints != null)
    //NOTE: .Value IS A STRING
    ViewData["ShowPasswordHints"] = passwordhints.Value;
else
    ViewData["ShowPasswordHints"] = "False";

//END PASSWORD HINTS CHECK

私が出力するページ自体に到達すると、コントローラーにあります

<%=ViewData["ShowPasswordHints"]%>タイトルタグに挿入すると、そこに「True」と表示されていることがわかります(引用符なしで、括弧で囲んでスペースもチェックしましたが、スペースはなく、文字通りTrueです)

しかし、私がするとき

<%if(ViewData["ShowPasswordHints"] == "True") {%> SHOW THIS <%}%>

SHOW THIS が表示されません。

更新: ただし、ViewData がこのように設定されている場合... IT WORKS... HUH??

if (accountRepository.isLDAPEnabled(_ID))
                ViewData["LDAP"] = "True";
            else
                ViewData["LDAP"] = "False";

見る...

<%if(ViewData["LDAP"] == "True"){ %>
           SHOW THIS
         <%} %>

みんなありがとう、これはうまく機能している新しい方法です

ViewData["something"] = true;

<%if(true.Equals(ViewData["something"])){%> SHOW THIS <%}%>
4

1 に答える 1

10

ViewDataであるためIDictionary<string, object>ViewData["ShowPasswordHints"]はタイプobjectです。デフォルトでは、objectsは参照によって比較されます。値の比較が必要です。したがって、それをにキャストしてみてくださいstring。これにより、値の比較が行われます。

<%if((string)ViewData["ShowPasswordHints"] == "True") {%> SHOW THIS <%}%>

詳細については、msdnをご覧ください。

更新:入力する値ViewData["ShowPasswordHints"]は常に文字列です。ただし、C#は静的に型指定されているため、コンパイラは、C#を取り出したときに文字列であることを認識しません。これViewDataは、IDictionary<string, object>(プレーンオブジェクトを返すディクショナリ)であるため、オブジェクトになることだけを認識します。しかし、あなたはもっとよく知っているので、stringあなたはそれがそうあるべきであるとあなたが知っているものにそれをキャストすることができます。(ところで、この理由やその他の理由から、ViewDataはMVCフレームワークの最も弱い点の1つだと思います)

これがで機能する<title>理由は、<%= %>タグがその中のすべてを呼び出すためToString()です。は文字列なのでViewData["ShowPasswordHints"]、期待どおりに出力されますToString()。文字列のは文字列そのものです。

最後に、なぜブール値を使用しないのですか?

于 2010-12-06T20:55:26.890 に答える