47

これはかなり基本的なことのように思えますし、そうあるべきですが、どこが間違っているのかわかりません。(私は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を次のように試しました。publicstring 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参照実行エラーが発生します。

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

4

6 に答える 6

106

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

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します。名前空間は、ヘルパーが含まれている名前空間を指します。

于 2012-07-02T15:31:03.037 に答える
13

ViewBagを使用する

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

あなたの見解で

<h1>@ViewBag.MyString</h1>

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

于 2015-08-07T08:08:11.613 に答える
5

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

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)
}
于 2012-07-02T16:48:25.473 に答える
2

@Steve Hobbsの答えはおそらく最良ですが、他の解決策のいくつかはうまくいった可能性があります。たとえば、 @Html.Label(ViewBag.CurrentPath);は、のような明示的なキャストで機能する可能性があり@Html.Label((string)ViewBag.CurrentPath);ます。また、inへの参照currentPath@Html.Label(ViewData["CurrentPath"].ToString());大文字になっていますが、他のコードは大文字ではありません。これが、null参照例外が発生した理由である可能性があります。

于 2012-07-02T15:35:21.047 に答える
1

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

public string ThemePath()

文字列自体を返すだけです。

于 2012-07-02T15:35:48.357 に答える
1

単に文字列をビューに戻そうとしている場合は、次のことを試してください。

public string Test()
{
     return "test";
}

これにより、testという単語が含まれるビューが返されます。文字列にHTMLを挿入できます。

これを試すこともできます:

public ActionResult Index()
{
    return Content("<html><b>test</b></html>");
}
于 2019-09-20T17:42:09.477 に答える