2011-10-21 66 views
9

Estoy tratando de pasar una variable de cadena dentro de asp.net MVC. Utilizo puntos de interrupción, así que veo que va al método correcto en el controlador, pero las variables publicadas son nulas.Pasando variables con POST en ASP.NET MVC

Mi marcado:

@{ 
    ViewBag.Title = "TestForm"; 
} 

<h2>TestForm</h2> 

@using (Html.BeginForm()) { 
    <input type="text" id="testinput" /> 

    <input type="submit" value="TestForm" /> 
} 

Mi controlador:

public ActionResult TestForm() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult TestForm(string testinput) 
{ 
    Response.Write("[" + testinput + "]"); 

    return View(); 
} 

pongo el punto de interrupción en el interior del segundo método TestForm y testinput es nula .... Me estoy perdiendo algo?

Nota: Me doy cuenta de que la mayoría de las veces voy a utilizar el modelo para pasar datos, pero me gustaría saber que también puedo pasar cadenas.

Como parte de la misma pregunta, ¿cómo paso varias variables? El método en mi controlador sería este:

[HttpPost] 
public ActionResult TestForm(string var1, var2) 
{ 
} 

Respuesta

18

Para mí, parece que no estableces el id. Uso MVC3 todos los días, así que no reproduzco tu muestra. (Estoy despierto durante 20 horas de programación;) pero aún estoy motivado para ayudar) Por favor dígame si no funciona. Pero para mí parece que tienes que establecer la propiedad "nombre" ... no la propiedad de identificación. Pruébalo ... ahora estoy esperando para ayudarte si no funciona.

 <input type="text" id="testinput" name="testinput" /> 
+0

sí funcionó hmmmm!. ¿Por qué MS decidió confiar en un nombre y no en un ID? ¿Por qué siempre lo hacen al revés? ¡Pero gracias! – sarsnake

+6

No, Microsoft es realmente genial con mvc, no piense en Microsoft al respecto. Se trata de estándares web. Básicamente, la propiedad id se utiliza para aplicar javascript (getElementsById, CSS-StyleSheets, jQuery y más). La propiedad del nombre es relevante para las publicaciones y las actividades asincrónicas (basadas en datos). – dknaack

+0

En un formulario html regular, nunca tuve que especificar la propiedad del nombre, el id siempre fue suficiente y las variables se publicaron correctamente. – sarsnake

1

En una nota ligeramente separada no hay nada de malo en pasar variables como eres, pero de una manera más eficiente sería pasar alrededor de un modelo de vista inflexible que le permite tomar ventaja de muchos aspectos de la bondad de MVC:

  • vistas de tipo fuerte
  • MVC modelo de unión
  • HTML Ayudantes

Crear un nuevo modelo de vista:

public class TestModel 
{ 
    public string TestInput { get; set; } 
} 

Su controlador de prueba:

[HttpGet] 
    public ActionResult TestForm() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult TestForm(FormCollection collection) 
    { 
     var model = new TestModel(); 
     TryUpdateModel(model, collection); 

     Response.Write("[" + model.TestInput + "]"); 

     return View(); 
    } 

Tu opinión: ¿

@model <yourproject>.Models.TestModel 

@{ 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 
<head> 
    <title>TestForm</title> 
</head> 
<body> 
    <div> 
     @using(Html.BeginForm()) 
     { 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.TestInput) 
      </div> 
      <div class="editor-label"> 
       @Html.TextBoxFor(m => m.TestInput) 
      </div> 
      <input type="submit" value="Test Form"/> 
     } 
    </div> 
</body> 
</html> 
+1

Si está predicando acerca de vistas fuertemente tipadas, ¿por qué debería confiar en formCollection en su método de acción POST? ¿No debería ser público ActionResult TestForm (modelo TestModel)? – Tommy

+0

Paso un FormCollection como este a los efectos de la prueba unitaria sin simulacros. Mi prueba puede pasar una colección de formularios a la llamada UpdateModel y hacer que asigne los valores al objeto modelo TestModel. – Jesse

Cuestiones relacionadas