将一个简单的字符串从控制器传递给视图MVC3

时间:2012-07-02 15:26:44

标签: c# asp.net-mvc asp.net-mvc-3 viewbag

我知道这看起来非常基本,而且应该是,但我无法找出我出错的地方。 (我已经在SO上阅读过其他类似标题的文章,以及网络上的其他资源,但仍然无法弄清楚),所以任何帮助都会受到赞赏。

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

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

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

    CurrentPath + =" Content \ CSS"

  3. 我想将文件名加载到数组或列表中

  4. 我想将此列表传递给我的视图以在组合框中呈现(在我的_Layout.cshtml上)。
  5. 重要的是要知道我正在尝试查看_Layout.cshtml上的字符串,因为我无法为它构建另一个视图。 (除非我错了,在这种情况下,我会提供任何帮助)。

    目前我仍在努力将一个简单的字符串传递给我的视图,我可以像在第2步一样自由地操作它。

    我从一个单独的静态类和一个全局变量开始:

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

    在我看来,我有:     @ Html.Label(MyProject.Web.Controllers.MyTheme.CurrentPath);

    这很有效,但是当我尝试使用if语句来确定字符串是空还是空时,我遇到了错误。所以我的下一次尝试都失败了。

    接下来我决定将它带入一个控制器(在本例中是我的BaseController),这就是我开始遇到问题的时候。代码如下:

    Inside BaseController Class

        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'没有适用的方法名称'标签'但似乎有一个名称的扩展方法。无法动态分派扩展方法。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。

    最后我在基地尝试了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(),我得到一个空引用错误。

    所以我现在有点失落,并且不知道我哪里出错了。提前感谢您的帮助。

6 个答案:

答案 0 :(得分:86)

要将字符串作为模型传递给视图,您可以执行以下操作:

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语句,并且命名空间指向您的帮助程序所在的命名空间,则Helper将起作用。

答案 1 :(得分:11)

使用 ViewBag

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

在您的视图中

<h1>@ViewBag.MyString</h1>

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

答案 2 :(得分:4)

为什么不使用简单的字符串参数创建一个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)
}

答案 3 :(得分:2)

@Steve Hobbs的回答可能是最好的,但是你的其他一些解决方案可以有效。例如,  @Html.Label(ViewBag.CurrentPath);可能会使用明确的演员,例如@Html.Label((string)ViewBag.CurrentPath);。此外,您对currentPath@Html.Label(ViewData["CurrentPath"].ToString());的引用是大写的,其中您的其他代码不是,这可能是您获得空引用异常的原因。

答案 4 :(得分:1)

只需像这样定义你的行动方法

public string ThemePath()

并简单地返回字符串。

答案 5 :(得分:0)

如果您只是想将字符串返回到视图,请尝试以下操作:

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

这将返回其中包含单词test的视图。您可以在字符串中插入一些html。

您也可以尝试以下方法:

public ActionResult Index()
{
    return Content("<html><b>test</b></html>");
}