C# 将一个简单字符串从控制器传递到视图MVC3

C# 将一个简单字符串从控制器传递到视图MVC3,c#,asp.net-mvc,asp.net-mvc-3,viewbag,C#,Asp.net Mvc,Asp.net Mvc 3,Viewbag,我知道这看起来很基本,应该是这样,但我不知道我错在哪里。(我已经在SO上读过其他类似标题的文章,以及网络上的其他资源,但仍然无法理解),因此任何帮助都将不胜感激 我有一个控制器,其中我设置了一个字符串变量。现在我不介意它是采用属性、ActionResult还是直接方法的形式。我只需要一个简单的字符串,我可以在控制器中使用它,并将其返回到视图中 基本上,我要做的是列出给定文件夹中的文件。所以我的逻辑是这样的: 查找当前文件夹(部分成功) 将路径附加到要定位文件的位置。i、 例如,如果我的当前文件夹

我知道这看起来很基本,应该是这样,但我不知道我错在哪里。(我已经在SO上读过其他类似标题的文章,以及网络上的其他资源,但仍然无法理解),因此任何帮助都将不胜感激

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

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

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

    CurrentPath+=“内容\CSS”

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

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

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

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

    public static class MyTheme
    {
        public static string CurrentPath = HostingEnvironment.MapPath("~");
    }
    
    在我看来,我有: @Label(MyProject.Web.Controllers.myteme.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;
        }
    
    我也不知道如何在视图中访问它

    @model MyViewModel
    @Html.Label(model => model.YourString)
    
    最后,我尝试使用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,如下所示: 公共字符串ThemePath() { ViewData[“currentPath”]=Server.MapPath(“~”)

    相应地,在_Layout.cshtml中,我尝试了:

         @Html.Label(ViewData["CurrentPath"].ToString());
    
    如果没有.ToString(),则会出现上述错误:

    在.ToString()中,我得到一个null reference execption错误


    因此,我现在有点迷路了,不知道哪里出了问题。提前感谢您的帮助。

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

    public ActionResult Index()
    {
        string myString = "This is my string";
        return View((object)myString);
    }
    
    您必须将其强制转换为对象,以便MVC不会尝试将字符串作为视图名称加载,而是将其作为模型传递。您还可以编写:

    return View("Index", myString);
    
    …这有点冗长

    然后在视图中,只需将其键入字符串:

    @model string
    
    <p>Value: @Model</p>
    
    然后在布局页面内:

    <p>Value: @Html.GetThemePath()</p>
    
    或: 路径:@Html.GetThemePath()

    编辑2:


    如前所述,如果将
    @using
    语句添加到视图顶部,且名称空间指向您的助手所在的名称空间,则助手将起作用。

    @Steve Hobbs的答案可能是最好的,但您的其他一些解决方案也可能起作用。例如,
    @Html.Label(ViewBag.CurrentPath);
    可能会使用显式强制转换,如
    @Html.Label((字符串)ViewBag.CurrentPath);
    。此外,您在
    @Html.Label(ViewData[“CurrentPath”].ToString()中对
    当前路径的引用;
    是大写的,而您的其他代码则不是,这可能就是您得到空引用异常的原因。

    只需像这样定义您的操作方法

    public string ThemePath()
    

    只需返回字符串本身。

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

    使用查看包

    ViewBag.MyString = "some string";
    return View();
    
    在你看来

    <h1>@ViewBag.MyString</h1>
    
    @ViewBag.MyString
    

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

    如果您试图简单地将字符串返回到视图,请尝试以下操作:

    public string Test()
    {
         return "test";
    }
    
    public ActionResult Index()
    {
        return Content("<html><b>test</b></html>");
    }
    
    这将返回一个包含单词test的视图。您可以在字符串中插入一些html

    您也可以尝试以下方法:

    public string Test()
    {
         return "test";
    }
    
    public ActionResult Index()
    {
        return Content("<html><b>test</b></html>");
    }
    
    public ActionResult Index()
    {
    返回内容(“测试”);
    }
    
    +1对于我见过的最大的问题+1给我一个+1,我试着把它删减。对不起!!:-)从控制器传递一个简单的字符串:::然后看一看问题..猜怎么着..我转到下一个问题..我为问题的长度道歉。我花了一整天的时间在这个问题上,差不多一个小时在这个问题上。相信我,这是真的时间长了很多。我在工作日快结束时提交,希望得到一个解决方案,但如果我在上面花费更多时间,我今天就不会发布。再次道歉。这个问题可能很长,但这正是我试图将2个字符串值传递给一个视图所做的。事实上,长期接受的答案对我没有帮助
    public ActionResult Index()
    {
        return Content("<html><b>test</b></html>");
    }