c# - 將一個簡單的字符串從控制器傳遞給視圖MVC3




viewdata (4)

我知道這看起來非常基本,應該是,但我無法找出我出錯的地方。 (我已經在SO上閱讀了其他類似標題的文章,以及網絡上的其他資源,但仍然無法弄清楚),所以任何幫助都將受到讚賞。

我有一個控制器,在其中我設置一個字符串變量。 現在我不介意它是採用屬性,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(),我得到一個空引用execption錯誤。

所以我現在有點失落,並不知道我哪裡出錯了。 在此先感謝您的幫助。

https://code.i-harness.com


@Steve Hobbs的答案可能是最好的,但是你的其他一些解決方案可能有效。 例如, @Html.Label(ViewBag.CurrentPath); 可能會使用顯式轉換,如@Html.Label((string)ViewBag.CurrentPath); 。 另外,您在@Html.Label(ViewData["CurrentPath"].ToString());引用currentPath @Html.Label(ViewData["CurrentPath"].ToString()); 是大寫的,其中你的其他代碼不是,這可能是你獲得空引用異常的原因。


使用ViewBag

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

在你的視圖中

<h1>@ViewBag.MyString</h1>

我知道這不能回答你的問題(已經回答了),但你的問題標題非常廣泛,可以讓這個頁面上的任何人正在搜索查詢,將一個簡單的字符串傳遞給View from Controller。


為什麼不使用簡單的字符串參數創建一個viewmodel,然後將其傳遞給視圖? 它具有可擴展性的好處(即您可以添加您可能想要在控制器中設置的任何其他內容)並且它非常簡單。

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)
}

要將字符串作為模型傳遞給視圖,您可以執行以下操作:

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

您必須將其強制轉換為對象,以便MVC不會嘗試將字符串作為視圖名稱加載,而是將其作為模型傳遞。 你也可以這樣寫:

return View("Index", myString);

..這有點冗長。

然後在您的視圖中,只需將其鍵入為字符串:

@model string

<p>Value: @Model</p>

然後你可以按照你想要的方式操縱Model。

要從佈局頁面訪問它,最好為此創建一個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語句,並且命名空間指向您的幫助程序所在的命名空間,則Helper將起作用。





viewbag