2011-10-07 10 views
5

¿Cómo se obtienen los datos del formulario después de enviarlo?MVC3 - Comprender POST con un botón

<form target="_self" runat="server"> 
    <p> 
    <select id="BLAHBLAH2"> 
     <option>2010</option> 
     <option>2011</option> 
     <option>2012</option> 
     <option>2013</option> 
    </select> 
    <input type="submit" runat="server" value="Change Year" /> 
    </p> 
</form> 

Esto golpea el método del controlador de Index. Pero no hay nada en Request.Form. ¿Por qué?

En segundo lugar, se pueden utilizar

<input type="button" en lugar de type=submit? Es decir, sin introducir ajax a través del onclick.

Finalmente, ¿cómo presento un método diferente en el controlador, p. Create?

+3

no es 'runat =" server "' a webforms cosas? –

Respuesta

7

Trate de no incluir esas variables de servidor runat. No deben usarse en ASP.NET MVC. Además, su selección no tiene un nombre. Si un elemento de entrada no tiene un nombre, no enviará nada. También sus etiquetas de opción deben tener atributos de valor que indica qué valor se envía al servidor si se selecciona esta opción:

<form action="/Home/Create" method="post"> 
    <p> 
    <select id="BLAHBLAH2" name="BLAHBLAH2"> 
     <option value="2010">2010</option> 
     <option value="2011">2011</option> 
     <option value="2012">2012</option> 
     <option value="2013">2013</option> 
    </select> 
    <input type="submit" value="Change Year" /> 
    </p> 
</form> 

Pero la forma correcta para generar formularios en ASP.NET MVC es el uso de ayudantes HTML. Dependiendo del motor de vista que esté utilizando, la sintaxis puede ser diferente. He aquí un ejemplo con el motor de vistas Razor:

@model MyViewModel 
@using (Html.BeginForm("Create", "Home")) 
{ 
    <p> 
     @Html.DropDownListFor(x => x.SelectedYear, Model.Years) 
     <input type="submit" value="Change Year" /> 
    </p> 
} 

aquí se tiene una vista inflexible hasta cierto punto de vista determinado modelo:

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

    public IEnumerable<SelectListItem> Years 
    { 
     get 
     { 
      return Enumerable 
       .Range(2010, 4) 
       .Select(x => new SelectListItem 
       { 
        Value = x.ToString(), 
        Text = x.ToString() 
       }); 
     } 
    } 
} 

que está poblada por alguna acción del controlador que hará que este punto de vista:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Create(MyViewModel model) 
    { 
     ... model.SelectedYear will contain the selected year 
    } 
} 
+0

Actualicé mi pregunta con Razor. Sin embargo, puedo hacer la traducción fácilmente. –

+0

@ P.Brian.Mackey, he actualizado mi respuesta con un ejemplo de Razor. –

+0

@DarinDimitrov - Me inclino ante tu nivel de detalle :) – Josh

2

Ninguno de sus <option> etiquetas tienen un valor:

... 
<option value="2010">2010</option> 
... 

Como señaló David, runat = "server" es definitivamente una cosa formularios Web, por lo que puede que 86.

Si desea enviar a un método diferente en su controlador solo necesita especificar la URL para ese método.

Fácil con Html.BeginForm:

@using (Html.BeginForm("AnotherAction", "ControllerName")) { 
    <!-- Your magic form here --> 
} 

Usando Url.Action

<form action="@Url.Action("AnotherAction")" method="POST"> 
    <!-- Your magic form here --> 
</form> 
+0

Gracias, es bueno ver un enfoque alternativo para lograr la tarea. –

0

puede también utilizar En controlador

int Value = Convert.ToInt32(Request["BLAHBLAH2"]); //To retrieve this int value 

En archivo .cshtml usar

<select id="IDxxx" name="BLAHBLAH2"> 

// Solicitud [ ""] va a recuperar el valor del objeto HTML, cuyo "nombre" que solicite.