vistas vista una tutorial pasar pagina net mvc multiples modelos modelo misma form datos controlador asp c# asp.net-mvc asp.net-mvc-3 viewbag

tutorial - pasar datos de una vista a un controlador c#



Pase una cadena simple del controlador a una vista MVC3 (5)

¿Por qué no crear un modelo de vista con un parámetro de cadena simple y luego pasarlo a la vista? Tiene el beneficio de ser extensible (es decir, puede agregar otras cosas que desee configurar en su controlador) y es bastante simple.

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

En la vista

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

En el controlador

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

Sé que esto parece bastante básico, y debería ser así, pero no puedo descubrir dónde me estoy equivocando. (He leído otros artículos con títulos similares en SO, y otros recursos en la web, pero aún no puedo descifrarlo), por lo que cualquier ayuda sería apreciada.

Tengo un controlador y en él estoy configurando una variable de cadena. Ahora no me importa si esto toma la forma de una propiedad, un ActionResult o un método directo. Solo quiero una cadena simple con la que pueda jugar en el controlador y devolverla a la vista.

Esencialmente, lo que intento hacer es enumerar los archivos en una carpeta determinada. Entonces mi lógica es así:

  1. Encuentra la carpeta actual (parcialmente exitosa)
  2. Agregue la ruta al lugar donde se encuentran los archivos que desea ubicar. es decir, si mi carpeta actual es Web /, agregaré algo como "Contenido / CSS" si quisiera enumerar todos los archivos CSS, por ejemplo. (Lo hago porque quiero permitir que el usuario cambie dinámicamente el sitio seleccionando el css para aplicar). Entonces se vería así:

    CurrentPath + = "Contenido / CSS"

  3. Quiero cargar los nombres de los archivos en una matriz o lista

  4. Quiero pasar esta lista a mi vista para hacerla en un cuadro combinado (que está en mi _Layout.cshtml).

Es importante saber que estoy tratando de ver la cadena en _Layout.cshtml ya que no puedo construir otra vista para ella. (A menos que me equivoque, en ese caso, agradecería cualquier ayuda).

Por el momento, sigo trabajando para que una cuerda simple pase a mi vista de una manera que puedo manipular libremente como en el paso 2.

Empecé con una clase estática separada y una variable global:

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

En mi opinión, tenía: @ Html.Label (MyProject.Web.Controllers.MyTheme.CurrentPath);

Esto funcionó, pero cuando traté de usar una instrucción if para determinar si la cadena era nula o estaba vacía, recibí errores. Entonces mis próximos intentos fracasaron.

Luego decidí llevarlo a un controlador (en este caso, mi BaseController) y fue entonces cuando comencé a tener problemas. Código a continuación:

Dentro de la clase BaseController

public ActionResult ThemePath() { string currentPath = Server.MapPath("~"); if (string.IsNullOrEmpty(currentPath)) { currentPath = "Error!"; } else { currentPath = "Our Path Is: " + currentPath; } return View(currentPath); }

No sé cómo acceder y ejecutar esto desde mi vista _Layout.cshtml

Entonces probé un método estándar dentro de BaseController:

public string ThemePath() { string currentPath = Server.MapPath("~"); if (string.IsNullOrEmpty(currentPath)) { currentPath = "Error!"; } else { currentPath = "Our Path Is: " + currentPath; } return currentPath; }

De nuevo, no sé cómo acceder a él en la vista

¡Finalmente traté de usar ViewBag y ViewData y ahora me estoy volviendo loco! Entonces en mi controlador base tengo:

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

y en mi opinión tengo

@Html.Label(ViewBag.CurrentPath);

o incluso

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

Con los siguientes pequeños mensajes de error amigables:

CS1973: ''System.Web.Mvc.HtmlHelper'' no tiene un método aplicable llamado ''Etiqueta'', pero parece tener un método de extensión con ese nombre. Los métodos de extensión no se pueden distribuir dinámicamente. Considere enviar los argumentos dinámicos o llamar al método de extensión sin la sintaxis del método de extensión.

Finalmente probé ViewData en la base de la siguiente manera: cadena pública 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(); }

y correspondientemente en _Layout.cshtml Probé:

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

Sin .ToString () obtengo el error anterior:

Con .ToString () obtengo un error de ejecución de refrencia nulo.

Así que estoy un poco perdido ahora y realmente no sé dónde me estoy equivocando. Gracias de antemano por cualquier ayuda.


La respuesta de @Steve Hobbs es probablemente la mejor, pero algunas de sus otras soluciones podrían haber funcionado. Por ejemplo, @Html.Label(ViewBag.CurrentPath); probablemente funcionará con un molde explícito, como @Html.Label((string)ViewBag.CurrentPath); . Además, su referencia a currentPath en @Html.Label(ViewData["CurrentPath"].ToString()); está en mayúscula, en donde su otro código no es, que es probablemente la razón por la que obtenía excepciones de referencia nula.


Para pasar una cadena a la vista como el Modelo, puede hacer:

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

Debes lanzarlo a un objeto para que MVC no intente cargar la cadena como el nombre de la vista, sino pasarlo como el modelo. También puedes escribir:

return View("Index", myString);

.. que es un poco más detallado.

Entonces, en su opinión, simplemente escríbalo como una cadena:

@model string <p>Value: @Model</p>

Entonces puedes manipular el Modelo como quieras.

Para acceder desde una página de diseño, sería mejor crear una HtmlExtension para esto:

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

Luego dentro de tu página de diseño:

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

Con suerte, puede aplicar esto a su propio escenario.

Editar: código explícito 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"; } } }

Entonces en tu opinión:

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

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

Editar 2:

Como se discutió, el Ayudante funcionará si agrega una declaración @using en la parte superior de su vista, con el espacio de nombres apuntando al que está en su ayudante.


Simplemente defina su método de acción como este

public string ThemePath()

y simplemente devuelve la cadena en sí.


Use ViewBag

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

En tu vista

<h1>@ViewBag.MyString</h1>

Sé que esto no responde a su pregunta (ya ha sido respondida), pero el título de su pregunta es muy amplio y puede hacer que cualquier persona en esta página busque una consulta para pasar una cadena simple a Ver desde el Controlador.