2

以前の投稿では、ドロップダウンからスタイルを選択して、 telerikデモサイトで行うのと同じ方法で、ビューにスタイルを設定するのに問題がありました。これは答えられましたが、私は今、新しいが関連する問題を抱えています。

私のサイトには(MVCで一般的なように)複数のページがあり、これらの各ページには多くのtelerikコントロールがあります。ユーザーが事前定義されたcssを使用してサイトのスタイルを設定できるようにすることは素晴らしいことであり、多くの作業を節約できます。

問題は、ページ間を移動すると、telerikが使用するコンボボックスがデフォルト値にリセットされるため、ユーザーがページを変更するたびにサイトのスタイルがリセットされることです(理想的ではありません)。

セッションを使用して状態を保存しようとしましたが、標準のaspx開発のようにポストバックを検出する方法はありません。だから私は次のようなことはできません:

if(isPostBack)
{
    if(string.isNullOrEmpty(Session["MyTheme"]+""))
    {
        Session["MyTheme"]="black";
    }
    else
    {
        Session["myTheme"]=//Some combo box selected value
    }
}

可能であっても、コンボボックスのonChangeイベントはJavaScriptを介して処理されますが、TelerikコントロールにはC#Razorが必要であり、私が管理しているように試してみると、彼らに話をさせて単純な値を共有させることはできません。

最終的に私がやりたいのは、ユーザーがコンボボックスからテーマを選択できるようにすることです。それ以降、そのテーマは、次に変更するまでサイト全体に記憶されます。

クエリ文字列とセッションを試しましたが、JavaScriptでアクセスできないため、どちらも機能しません。どうやらそれらはサーバー側でのみ使用されます。

Cookieを試しましたが、C#Razorでアクセスできないため、機能しません。どうやら彼らはクライアントサイドのみです。

以下は私のコードです:

<head>
@(
  Html.Telerik().StyleSheetRegistrar()
                .DefaultGroup(group => group
                .Add("telerik.common.css")
                .Add(string.IsNullOrEmpty(@Html.ViewContext.HttpContext.Request.QueryString["theme"]) ? "telerik.black.css" : "telerik."+@Html.ViewContext.HttpContext.Request.QueryString["theme"]+".css").Combined(true).Compress(true)
                ))
</head>


<body>
                    @(
                        /* TELERIK COMBOBOX */

                        Html.Telerik().ComboBox()
                        .Name("cbxTheme")
                        .SelectedIndex(0)
                        .ClientEvents(events => events.OnChange("cbxTheme_onChange"))
                        //.BindTo((IEnumerable<DropDownItem>)ViewData["Files"])
                        .Items(item =>
                            {
                                item.Add().Text("black");
                                item.Add().Text("common");
                                item.Add().Text("default");
                                item.Add().Text("forest");
                                item.Add().Text("hay");
                                item.Add().Text("metro");
                                item.Add().Text("office2007");
                                item.Add().Text("office2010black");
                                item.Add().Text("office2010blue");
                                item.Add().Text("office2010silver");
                                item.Add().Text("outlook");
                                item.Add().Text("rtl");
                                item.Add().Text("simple");
                                item.Add().Text("sitefinity");
                                item.Add().Text("sunset");
                                item.Add().Text("telerik");
                                item.Add().Text("transparent");
                                item.Add().Text("vista");
                                item.Add().Text("web20");
                                item.Add().Text("webblue");
                                item.Add().Text("windows7");
                            })
                    )

@(Html.Telerik().ScriptRegistrar().DefaultGroup(group => group.Combined(true).Compress(true)))

</body>

<script type="text/javascript">
function cbxTheme_onChange()
{
    var selectedItemText = $("#cbxTheme").data("tComboBox").text();
    //var selectedItemValue = $("#cbxTheme").data("tComboBox").value();
    window.location.href = window.location.protocol
                         + '//'
                         + window.location.host
                         + window.location.pathname
                         + '?theme='
                         + selectedItemText;
}
</script>

私が説明したように、ほとんどの場合、それはうまく機能します。別のページへのリンクをクリックすると実行されます。その後、すべてが事前設定されたデフォルトに戻されます。

理想的には、私が探しているのは、コンボボックスで新しいアイテムが選択されたときにポストバックを実行する方法です(JavaScriptのように)。スタイルが変更されたため、とにかくページ全体を更新する必要があります。これは機能します。しかし、別のページに移動すると、デフォルトのスタイルにリセットされます。したがって、選択したスタイルをクライアント側またはサーバー側のいずれかに保存する方法が必要です(ページがこの方法で読み込まれるため、推奨されます)。

これはコントローラーを使用して実行できることを読みましたが、その方法は明確ではありません。コントローラーを使用してCSSスタイルのリストを動的にロードし、ユーザーが追加のスタイルをダウンロードできるようにするため、可能であればコントローラーメソッドが必要です。これらのスタイルは自動的にリストに追加されます。したがって、この線に沿ったものは何でも素晴らしいでしょう。

4

1 に答える 1

2

グローバルプロパティとして機能する静的プロパティを使用して静的クラスを作成できます。

public static class MyTheme
{
    public static string MyGlobalTheme { get; set; }
}

または、Applicationクラスを使用できます。

Application["MyTheme"] = "black";

このコードを_Layout.cshtmlに入れることができます。プロジェクト名がTProjで、静的クラスがObjectsというフォルダーにある場合、次のようになります。

_Layout.cshtml

@{
  if (@Html.ViewContext.HttpContext.Request.QueryString["theme"] != null)
  {
    TProj.Objects.MyTheme.MyGlobalTheme = Html.ViewContext.HttpContext.Request.QueryString["theme"];
  }
  else
  {
    if (TProj.Objects.MyTheme.MyGlobalTheme == null)
    {
      TProj.Objects.MyTheme.MyGlobalTheme = "black";
    }
  }
}

この後、_Layout.cshtmlで、文字列@ TreasuryReportsMvc.Objects.MyTheme.MyGlobalThemeを使用できます。これは、別のページに移動しても同じままである必要があります。_Layout.cshtmlは、このロジックに最適な場所ではない可能性があります。プロジェクトにとって最も意味のある場所について考える必要があります。

グローバル変数は多くの人に嫌われていることに注意してください。この質問には、Asp.NetMVCグローバル変数についての良い議論があります。

于 2012-06-28T18:24:38.327 に答える