47

我知道这看起来很基本,而且应该是,但我不知道我哪里出错了。(我已经阅读了其他类似标题的文章,以及网络上的其他资源,但仍然无法弄清楚),所以任何帮助将不胜感激。

我有一个控制器,我在其中设置了一个字符串变量。现在我不介意这是否采用属性、ActionResult 或直接方法的形式。我只想要一个可以在控制器中使用的简单字符串,并将其返回给视图。

基本上我要做的是列出给定文件夹中的文件。所以我的逻辑是这样的:

  1. 找到当前文件夹(部分成功)
  2. 将路径附加到您要定位的文件所在的位置。即,如果我当前的文件夹是 Web\,那么如果我想列出所有 CSS 文件,我将附加类似“Content\CSS”的内容。(我这样做是因为我希望允许用户通过选择要应用的 css 来动态更改站点)。所以它看起来像:

    CurrentPath += "内容\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 语句来确定字符串是空还是空时,我得到了错误。所以我接下来的尝试都失败了。

接下来我决定把它带入一个控制器(在本例中是我的 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() 我得到一个空引用执行错误。

所以我现在有点迷路了,真的不知道我哪里出错了。提前感谢您的帮助。

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>

我知道这不能回答你的问题(它已经得到了回答),但是你的问题的标题非常广泛,可以让任何人在这个页面上搜索一个查询以将一个简单的字符串从 Controller 传递给 View。

于 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);. 此外,您对currentPathin的引用@Html.Label(ViewData["CurrentPath"].ToString());是大写的,而您的其他代码不是,这可能就是您得到空引用异常的原因。

于 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 回答