我知道这看起来非常基本,而且应该是,但我无法找出我出错的地方。 (我已经在SO上阅读过其他类似标题的文章,以及网络上的其他资源,但仍然无法弄清楚),所以任何帮助都会受到赞赏。
我有一个控制器,我在其中设置一个字符串变量。现在我不介意如果它采用属性,ActionResult或直接方法的形式。我只想要一个简单的字符串,我可以在控制器中玩,并将其返回到视图。
基本上我要做的是列出给定文件夹中的文件。所以我的逻辑是这样的:
将路径追加到您要找到的文件所在的位置。即如果我当前的文件夹是Web \那么我会附加类似" Content \ CSS"如果我想列出所有的CSS文件,例如。 (我这样做是因为我希望允许用户通过选择要应用的CSS来动态更改网站)。所以它看起来像:
CurrentPath + =" Content \ CSS"
我想将文件名加载到数组或列表中
重要的是要知道我正在尝试查看_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(),我得到一个空引用错误。
所以我现在有点失落,并且不知道我哪里出错了。提前感谢您的帮助。
答案 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>");
}