通过来自控制器的简单字符串到视图MVC3(Pass a simple string from con

2019-07-30 04:52发布

我知道这似乎很基本的,也是应该的,但我不能找出我错了。 (我读HVE上如此相似的标题,并在网络上的资源,但是仍然无法想出办法来的其他文章),所以任何帮助,将不胜感激。

我有一个控制器和它我设置一个字符串变量。 现在我不介意这需要一个属性,一个ActionResult,或直方法的形式。 我只想要一个简单的字符串,我可以在控制器一起玩,并返回到视图。

从本质上讲什么,我试图做的是列出一个给定的文件夹中的文件。 所以我的逻辑是这样的:

  1. 查找当前文件夹(部分成功)
  2. 追加的路径,要找到这些文件的。 也就是说,如果我的当前文件夹是网络\然后我会追加类似“内容\ CSS”如果我想列出所有例如CSS文件。 (我这样做是因为我想允许用户通过选择CSS应用动态地更改网站)。 因此,它看起来像:

    CurrentPath + = “内容\ CSS”

  3. 我想要的文件名加载到一个数组或列表

  4. 我想这个列表传递给我的看法在组合框中(这是我的_Layout.cshtml)来呈现。

重要的是要知道,我想查看有关_Layout.cshtml字符串作为我不能只是建立了它的另一个观点是非常重要的。 (除非我错了,在这种情况下我会appreicate任何帮助)。

目前我还在努力让传递给我的看法的方式,我可以自由地操纵它就像在步骤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”有一个名为“标签”没有适用的方法,但似乎有这个名字的扩展方法。 扩展方法不能动态调度。 考虑强制转换动态参数或调用没有扩展方法的语法的扩展方法。

最后,我试图ViewData的在基如下:public串ThemePath(){计算机[ “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()我得到一个空refrence execption错误。

所以我现在有点迷失和真的不知道我要去的地方错了。 在此先感谢您的帮助。

Answer 1:

为了传递一个字符串到视图模型,你可以这样做:

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声明视图的顶部,指向一个你的助手是在命名空间。



Answer 2:

使用ViewBag

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

在你看来

<h1>@ViewBag.MyString</h1>

我知道这并不能回答你的问题(它已经回答了),但你的问题的标题是非常广阔的,可以把这个网页谁正在寻找传递一个简单的字符串从控制器查看查询任何人。



Answer 3:

为什么不创建一个简单的字符串参数的视图模型,然后传递到视图? 它拥有的是可延展的利益(即你可以再加入你可能想在你的控制器设置任何其他的东西),它是相当简单的。

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


Answer 4:

@Steve霍布斯的回答可能是最好的,但你的一些其他的解决方案可以工作。 例如, @Html.Label(ViewBag.CurrentPath); 将可能有明确的转换,如工作@Html.Label((string)ViewBag.CurrentPath); 。 此外,您的参考currentPath@Html.Label(ViewData["CurrentPath"].ToString()); 是大写的,其中你的其他代码不是这样,这可能是为什么你越来越空引用例外。



Answer 5:

只是这样定义你的操作方法

public string ThemePath()

并简单地返回字符串本身。



文章来源: Pass a simple string from controller to a view MVC3