web-dev-qa-db-ja.com

コントローラからビューMVC3に単純な文字列を渡します

私はこれがかなり基本的なものであり、そうあるべきであることを知っていますが、どこが間違っているのかわかりません。 (SOで同様のタイトルを持つ他の記事、およびWeb上の他のリソースを読んだことがありますが、それでも理解できません)。

コントローラがあり、その中に文字列変数を設定しています。これがプロパティ、ActionResult、またはストレートメソッドの形式をとるかどうかは気にしません。コントローラーで再生できるシンプルな文字列が必要で、それをビューに返します。

基本的に、私がしようとしているのは、指定されたフォルダ内のファイルをリストすることです。したがって、私のロジックは次のようになります。

  1. 現在のフォルダーを見つける(部分的に成功)
  2. 配置するファイルがある場所にパスを追加します。つまり、現在のフォルダーがWeb \の場合、たとえばすべてのCSSファイルをリストしたい場合は、「Content\CSS」のようなものを追加します。 (適用するcssを選択することで、ユーザーがサイトを動的に変更できるようにするため、これを行います)。したがって、次のようになります。

    CurrentPath + = "Content\CSS"

  3. ファイル名を配列またはリストにロードしたい

  4. このリストをビューに渡して、コンボボックス(_Layout.cshtmlにあります)でレンダリングします。

別のビューを作成することはできないので、_Layout.cshtmlの文字列を表示しようとしていることを知っておくことが重要です。 (私が間違っていない限り、その場合、私は助けを評価します)。

現時点では、ステップ2のように自由に操作できるように、ビューに単純な文字列を渡すことに取り組んでいます。

個別の静的クラスとグローバル変数から始めました。

public static class MyTheme
{
    public static string CurrentPath = HostingEnvironment.MapPath("~");
}

私の見解では:@ Html.Label(MyProject.Web.Controllers.MyTheme.CurrentPath);

これは機能しましたが、ifステートメントを使用して文字列がnullまたは空かどうかを判断しようとすると、エラーが発生しました。したがって、私の次の試みはすべて失敗しました。

次に、コントローラー(この場合はBaseController)に組み込むことにしました。これが問題に遭遇し始めたときです。以下のコード:

内部BaseControllerクラス

    public ActionResult ThemePath()
    {
        string currentPath = Server.MapPath("~");

        if (string.IsNullOrEmpty(currentPath))
        {
            currentPath = "Error!";
        }
        else
        {
            currentPath = "Our Path Is: " + currentPath;
        }

        return View(currentPath);
    }

_Layout.cshtmlビュー内からこれにアクセスして実行する方法がわかりません

そこで次に、BaseController内で標準のメソッドを試しました。

    public string ThemePath()
    {
        string currentPath = Server.MapPath("~");

        if (string.IsNullOrEmpty(currentPath))
        {
            currentPath = "Error!";
        }
        else
        {
            currentPath = "Our Path Is: " + currentPath;
        }

        return currentPath;
    }

繰り返しますが、私はビューでそれにアクセスする方法がわかりません

最後に、ViewBagとViewDataを使おうとしましたが、今は気が狂っています!だから私のベースコントローラーには:

    public string ThemePath()
    {
        ViewBag.currentPath = Server.MapPath("~");

        if (string.IsNullOrEmpty(ViewBag.currentPath))
        {
            ViewBag.currentPath = "Error!";
        }
        else
        {
            ViewBag.currentPath = "Our Path Is: " + ViewBag.currentPath;
        }

        return ViewBag.currentPath;
    }

私の意見では

     @Html.Label(ViewBag.CurrentPath);

あるいは

     @Html.Label(ViewBag.CurrentPath.ToString());

次のわかりやすい小さなエラーメッセージが表示されます。

CS1973:「System.Web.Mvc.HtmlHelper」には「Label」という名前の適用可能なメソッドはありませんが、その名前の拡張メソッドがあるようです。拡張メソッドを動的にディスパッチすることはできません。動的引数をキャストするか、拡張メソッド構文なしで拡張メソッドを呼び出すことを検討してください。

最後に、次のようにベースでViewDataを試しました。public string ThemePath(){ViewData ["currentPath"] = Server.MapPath( "〜");

        if (string.IsNullOrEmpty(ViewData["currentPath)"].ToString()))
        {
            ViewData["currentPath"] = "Error!";
        }
        else
        {
            ViewData["currentPath"] = "Our Path Is: " + ViewData["currentPath"];
        }

        return ViewData["currentPath"].ToString();
    }

それに対応して、_Layout.cshtmlで試しました:

     @Html.Label(ViewData["CurrentPath"].ToString());

.ToString()なしでは、上記のエラーが発生します。

.ToString()を使用すると、null refrence execptionエラーが発生します。

だから私は今はちょっと迷ってしまい、どこが間違っているのか本当に分かりません。助けてくれてありがとう。

38
Francis Rodgers

文字列をモデルとしてビューに渡すには、次のようにします。

_public ActionResult Index()
{
    string myString = "This is my string";
    return View((object)myString);
}
_

MVCが文字列をビュー名としてロードしようとするのではなく、モデルとして渡すように、オブジェクトにキャストする必要があります。次のように書くこともできます:

_return View("Index", myString);
_

..これはもう少し冗長です。

次に、ビューで文字列として入力します。

_@model string

<p>Value: @Model</p>
_

その後、モデルを自由に操作できます。

レイアウトページからアクセスするには、このためのHtmlExtensionを作成することをお勧めします。

_public static string GetThemePath(this HtmlHelper helper)
{
    return "/path-to-theme";
}
_

次に、レイアウトページ内で:

_<p>Value: @Html.GetThemePath()</p>
_

これを自分のシナリオに適用できることを願っています。

編集:明示的なHtmlHelperコード:

_namespace <root app namespace>
{
    public static class Helpers
    {
        public static string GetThemePath(this HtmlHelper helper)
        {
            return System.Web.Hosting.HostingEnvironment.MapPath("~") + "/path-to-theme";
        }
    }
}
_

次に、あなたの意見で:

_@{
    var path = Html.GetThemePath();
    // .. do stuff
}
_

または:<p>Path: @Html.GetThemePath()</p>

編集2:

説明したように、ヘルパーは、_@using_ステートメントをビューの上部に追加し、ヘルパーが含まれている名前空間を指す名前空間を使用すると機能します。

88
Steve Hobbs

ViewBagを使用します

ViewBag.MyString = "some string";
return View();

あなたのビューで

<h1>@ViewBag.MyString</h1>

私はこれがあなたの質問に答えていないことを知っています(すでに答えられています)が、あなたの質問のタイトルは非常に広大であり、コントローラーからビューに単純な文字列を渡すためのクエリを探している人を連れて来ることができます。

11
Jayant Varshney

単純な文字列パラメーターでビューモデルを作成し、それをビューに渡してみませんか?拡張可能であるという利点があります(つまり、コントローラーに設定したい他のものを追加することができます)そして、それはかなり簡単です。

public class MyViewModel
{
    public string YourString { get; set; }
}

ビューで

@model MyViewModel
@Html.Label(model => model.YourString)

コントローラー内

public ActionResult Index() 
{
     myViewModel = new MyViewModel();
     myViewModel.YourString = "However you are setting this."
     return View(myViewModel)
}
4
Saedeas

@Steve Hobbsの答えはおそらく最良ですが、他のソリューションのいくつかcouldは機能しました。たとえば、@Html.Label(ViewBag.CurrentPath);は、おそらく@Html.Label((string)ViewBag.CurrentPath);のような明示的なキャストで動作します。また、@Html.Label(ViewData["CurrentPath"].ToString());currentPathへの参照は大文字で、他のコードでは大文字ではないため、おそらくnull参照例外が発生していました。

2
Ross

このようにアクションメソッドを定義するだけです

public string ThemePath()

単純に文字列自体を返します。

1