Подтвердить что ты не робот

Передайте простую строку от контроллера к представлению 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.

Итак, я сейчас потерялся и не знаю, где я ошибаюсь. Заранее благодарим за любую помощь.

4b9b3361

Ответ 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>");
}