web-dev-qa-db-fra.com

Passer une chaîne simple du contrôleur à une vue MVC3

Je sais que cela semble assez basique, et ça devrait l'être, mais je ne peux pas savoir où je me trompe. (J'ai lu d'autres articles avec des titres similaires sur SO et d'autres ressources sur le Web, mais je n'arrive toujours pas à le comprendre), donc toute aide serait appréciée.

J'ai un contrôleur et je mets en place une variable de chaîne. Maintenant, cela ne me dérange pas si cela prend la forme d'une propriété, d'un ActionResult ou d'une méthode directe. Je veux juste une chaîne simple avec laquelle je peux jouer dans le contrôleur et la retourner à la vue.

Essentiellement, ce que j'essaie de faire est de répertorier les fichiers dans un dossier donné. Donc ma logique est comme ça:

  1. Trouver le dossier actuel (partiellement réussi)
  2. Ajoutez le chemin d'accès à l'emplacement des fichiers que vous souhaitez localiser. c'est-à-dire si mon dossier actuel est Web\alors j'ajouterai quelque chose comme "Content\CSS" si je voulais lister tous les fichiers CSS par exemple. (Je fais cela parce que je veux permettre à l'utilisateur de changer dynamiquement le site en sélectionnant le CSS à appliquer). Cela ressemblerait donc à:

    CurrentPath + = "Contenu\CSS"

  3. Je veux charger les noms de fichiers dans un tableau ou une liste

  4. Je veux passer cette liste à ma vue pour la rendre dans une zone de liste déroulante (qui se trouve sur mon _Layout.cshtml).

Il est important de savoir que j'essaie d'afficher la chaîne sur le _Layout.cshtml car je ne peux pas simplement créer une autre vue pour cela. (À moins que je ne me trompe, dans ce cas, j'apprécierais toute aide).

Pour le moment, je travaille toujours à faire passer une simple chaîne à ma vue de manière à pouvoir la manipuler librement comme à l'étape 2.

J'ai commencé avec une classe statique distincte et une variable globale:

public static class MyTheme
{
    public static string CurrentPath = HostingEnvironment.MapPath("~");
}

À mon avis, j'avais: @ Html.Label (MyProject.Web.Controllers.MyTheme.CurrentPath);

Cela a fonctionné mais quand j'ai essayé d'utiliser une instruction if pour déterminer si la chaîne était nulle ou vide, j'ai eu des erreurs. Mes prochaines tentatives ont donc toutes échoué.

Ensuite, j'ai décidé de l'intégrer dans un contrôleur (dans ce cas, mon BaseController) et c'est à ce moment que j'ai commencé à rencontrer des problèmes. Code ci-dessous:

À l'intérieur de la classe BaseController

    public ActionResult ThemePath()
    {
        string currentPath = Server.MapPath("~");

        if (string.IsNullOrEmpty(currentPath))
        {
            currentPath = "Error!";
        }
        else
        {
            currentPath = "Our Path Is: " + currentPath;
        }

        return View(currentPath);
    }

Je ne sais pas comment y accéder et l'exécuter à partir de ma vue _Layout.cshtml

J'ai ensuite essayé une méthode standard à l'intérieur de BaseController:

    public string ThemePath()
    {
        string currentPath = Server.MapPath("~");

        if (string.IsNullOrEmpty(currentPath))
        {
            currentPath = "Error!";
        }
        else
        {
            currentPath = "Our Path Is: " + currentPath;
        }

        return currentPath;
    }

Encore une fois, je ne sais pas comment y accéder dans la vue

Enfin, j'ai essayé d'utiliser ViewBag et ViewData et maintenant je ne fais que des bonkers! Donc, dans mon contrôleur de base, j'ai:

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

et à mon avis, j'ai

     @Html.Label(ViewBag.CurrentPath);

ou même

     @Html.Label(ViewBag.CurrentPath.ToString());

Avec les petits messages d'erreur suivants:

CS1973: "System.Web.Mvc.HtmlHelper" n'a pas de méthode applicable nommée "Label" mais semble avoir une méthode d'extension de ce nom. Les méthodes d'extension ne peuvent pas être distribuées dynamiquement. Pensez à transtyper les arguments dynamiques ou à appeler la méthode d'extension sans la syntaxe de la méthode d'extension.

Enfin, j'ai essayé ViewData dans la base comme suit: chaîne publique 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();
    }

et en conséquence dans le _Layout.cshtml j'ai essayé:

     @Html.Label(ViewData["CurrentPath"].ToString());

Sans le .ToString () j'obtiens l'erreur ci-dessus:

Avec le .ToString () j'obtiens une erreur d'exception de réfraction nulle.

Je suis donc un peu perdu maintenant et je ne sais pas vraiment où je vais mal. Merci d'avance pour votre aide.

38
Francis Rodgers

Pour passer une chaîne à la vue en tant que modèle, vous pouvez:

public ActionResult Index()
{
    string myString = "This is my string";
    return View((object)myString);
}

Vous devez le convertir en un objet pour que MVC n'essaye pas de charger la chaîne comme nom de vue, mais plutôt de la passer en tant que modèle. Vous pouvez également écrire:

return View("Index", myString);

.. qui est un peu plus verbeux.

Ensuite, dans votre vue, tapez-le simplement sous forme de chaîne:

@model string

<p>Value: @Model</p>

Ensuite, vous pouvez manipuler le modèle comme vous le souhaitez.

Pour y accéder à partir d'une page de mise en page, il pourrait être préférable de créer une extension Html pour cela:

public static string GetThemePath(this HtmlHelper helper)
{
    return "/path-to-theme";
}

Puis à l'intérieur de votre page de mise en page:

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

J'espère que vous pourrez l'appliquer à votre propre scénario.

Edit: code HtmlHelper explicite:

namespace <root app namespace>
{
    public static class Helpers
    {
        public static string GetThemePath(this HtmlHelper helper)
        {
            return System.Web.Hosting.HostingEnvironment.MapPath("~") + "/path-to-theme";
        }
    }
}

Ensuite, selon vous:

@{
    var path = Html.GetThemePath();
    // .. do stuff
}

Ou: <p>Path: @Html.GetThemePath()</p>

Modifier 2:

Comme indiqué, l'aide fonctionnera si vous ajoutez une instruction @using En haut de votre vue, l'espace de noms pointant vers celle dans laquelle se trouve votre aide.

88
Steve Hobbs

Utilisez ViewBag

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

À votre avis

<h1>@ViewBag.MyString</h1>

Je sais que cela ne répond pas à votre question (il a déjà été répondu), mais le titre de votre question est très vaste et peut amener toute personne sur cette page qui recherche une requête pour passer une chaîne simple à View from Controller.

11
Jayant Varshney

Pourquoi ne pas créer un modèle de vue avec un simple paramètre de chaîne, puis le transmettre à la vue? Il a l'avantage d'être extensible (c'est-à-dire que vous pouvez ensuite ajouter d'autres éléments que vous souhaitez définir dans votre contrôleur) et c'est assez simple.

public class MyViewModel
{
    public string YourString { get; set; }
}

Dans la vue

@model MyViewModel
@Html.Label(model => model.YourString)

Dans le contrôleur

public ActionResult Index() 
{
     myViewModel = new MyViewModel();
     myViewModel.YourString = "However you are setting this."
     return View(myViewModel)
}
4
Saedeas

La réponse de @Steve Hobbs est probablement la meilleure, mais certaines de vos autres solutions pourraient ont fonctionné. Par exemple, @Html.Label(ViewBag.CurrentPath); fonctionnera probablement avec un transtypage explicite, comme @Html.Label((string)ViewBag.CurrentPath);. De plus, votre référence à currentPath dans @Html.Label(ViewData["CurrentPath"].ToString()); est en majuscule, ce qui n'est pas le cas de votre autre code, ce qui explique probablement pourquoi vous obteniez des exceptions de référence nulles.

2
Ross

Définissez simplement votre méthode d'action comme ceci

public string ThemePath()

et renvoyez simplement la chaîne elle-même.

1
Ventsyslav Raikov