Передайте простую строку от контроллера к представлению MVC3
Я знаю, что это кажется довольно простым, и это должно быть, но я не могу узнать, где я ошибаюсь. (Я прочитал другие статьи с похожими названиями на SO и другие ресурсы в Интернете, но все же не могу понять это), поэтому любая помощь будет оценена.
У меня есть контроллер, и в нем я устанавливаю строковую переменную. Теперь я не возражаю, если это принимает форму свойства, ActionResult или прямой метод. Я просто хочу простую строку, с которой я могу играть в контроллере, и вернуть ее в представление.
По сути, я пытаюсь перечислить файлы в данной папке. Итак, моя логика такова:
- Найти текущую папку (частично успешно)
-
Добавьте путь к тому, где находятся файлы, которые вы хотите найти. т.е. если моя текущая папка - это Web \, то я добавлю что-то вроде "Content\CSS", если я хотел бы, например, перечислить все файлы CSS. (Я делаю это, потому что я хочу разрешить пользователю динамически изменять сайт, выбирая css для применения). Таким образом, это будет выглядеть так:
CurrentPath + = "Content\CSS"
-
Я хочу загрузить имена файлов в массив или список
- Я хочу передать этот список моему представлению для рендеринга в поле со списком (которое находится на моем _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() я получаю ошибку с ошибкой null refrence.
Итак, я сейчас потерялся и не знаю, где я ошибаюсь. Заранее благодарим за любую помощь.
Ответы
Ответ 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
в начало вашего представления, с пространством имен, указывающим на тот, в котором находится ваш помощник.
Ответ 2
Используйте ViewBag
ViewBag.MyString = "some string";
return View();
В вашем представлении
<h1>@ViewBag.MyString</h1>
Я знаю, что это не отвечает на ваш вопрос (на это уже был дан ответ), но название вашего вопроса очень обширно и может привести любого человека на эту страницу, который ищет запрос для передачи простой строки в View from контроллер.
Ответ 3
Почему бы не создать 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)
}
Ответ 4
Ответ на @Steve Hobbs, вероятно, лучший, но некоторые из ваших других решений могли бы сработать. Например,
@Html.Label(ViewBag.CurrentPath);
, вероятно, будет работать с явным литом, например @Html.Label((string)ViewBag.CurrentPath);
. Кроме того, ваша ссылка на currentPath
в @Html.Label(ViewData["CurrentPath"].ToString());
заглавна, а ваш другой код - нет, поэтому, вероятно, вы получаете нулевые ссылочные исключения.
Ответ 5
Просто определите способ действия, подобный этому
public string ThemePath()
и просто верните строку.
Ответ 6
Если вы пытаетесь просто вернуть строку в представление, попробуйте следующее:
public string Test()
{
return "test";
}
Это вернет вид со словом test в нем. Вы можете вставить html в строку.
Вы также можете попробовать это:
public ActionResult Index()
{
return Content("<html><b>test</b></html>");
}