textboxfor son que mvc los example dropdownlist c# .net asp.net-mvc html-helper

c# - son - ASP.NET MVC: el valor del campo oculto no se representa utilizando HtmlHelper.Hidden



que son los helpers en mvc (2)

Algo bastante extraño está sucediendo con mi aplicación:

Tengo la siguiente propiedad en mi ViewModel:

public int? StakeholderId { get; set; }

Se procesa en una vista parcial de la siguiente manera:

<%= Html.Hidden("StakeholderId", Model.StakeholderId) %>

El formulario se envía y la acción del controlador relevante genera una identificación y actualiza el modelo, antes de devolver la misma vista con el modelo actualizado

El problema que estoy experimentando es que el campo oculto no tiene nada en su atributo de "valor" representado la segunda vez, aunque StakeholderId ahora tiene un valor.

Si acabo de mostrar el valor por sí mismo, aparece en la página, así que lo renderizo al hacer esto:

<input type="hidden" id="StakeholderId" name="stakeholderId" value="<%: Model.StakeholderId %>" />

¿Pero es bastante extraño que el ayudante no recoja el valor actualizado?

(Estoy usando jQuery para enviar formularios y presentar los resultados de la acción en divs, pero he comprobado que el html que recibo ya está mal antes de que jQuery haga algo con él, así que no creo que eso tenga mucho que ver con cualquier cosa)

ACTUALIZAR

Desde entonces, descubrí que también puedo borrar la clave StateState relevante antes de que mi acción de controlador devuelva la vista parcial.


ADDENDUM: múltiples formularios HTML, por ejemplo, en una cuadrícula

Como una adición a este tema, hay que tener MUCHO cuidado con los formularios múltiples en la misma página, por ejemplo, en una grilla, digamos uno generado usando Ajax.BeginForm.

Es posible que tengas la tentación de escribir algo como:

@foreach (var username in Model.TutorUserNames) { <tr> <td> @Html.ActionLink(username, MVC.Admin.TutorEditor.Details(username)) </td> <td> @using (Ajax.BeginForm("DeleteTutor", "Members", new AjaxOptions { UpdateTargetId = "AdminBlock", OnBegin = "isValidPleaseWait", LoadingElementId = "PleaseWait" }, new { name = "DeleteTutorForm", id = "DeleteTutorForm" })) { <input type="submit" value="Delete" /> @Html.Hidden("TutorName", username) } </td> </tr> }

La línea letal aquí es:

@Html.Hidden("TutorName", username)

... y tiene la intención de utilizar TutorName como el parámetro de su acción. P.EJ:

public virtual ActionResult DeleteTutor(string TutorName){...}

Si haces esto, la sorpresa desagradable en la que te encuentras es que Html.Hidden ("TutorName", nombre de usuario), como explica Darin Dimitrov, mostrará el último valor POST. Es decir, independientemente de su ciclo, TODOS los elementos se representarán con el TutorName del último tutor eliminado.

La palabra alrededor, en la sintaxis Razor es reemplazar la llamada @ Html.Hidden con una etiqueta de entrada explícita:

<input type="hidden" id="TutorName" name="TutorName" value=''@username'' />

Esto funciona como se esperaba

Es decir:

NUNCA, NUNCA USE Html.Hidden PARA PASAR UN PARÁMETRO DE VUELTA A SUS ACCIONES CUANDO USTED ESTÁ USANDO MÚLTIPLES FORMAS EN UNA REJILLA !!!

Final Caveat:

Al construir su etiqueta de entrada oculta, debe incluir el nombre y el ID, establecer el mismo valor, de lo contrario, en el momento de la escritura (febrero de 2011) no funcionará correctamente. Ciertamente no en Google Chrome. Todo lo que obtiene es un parámetro nulo devuelto si solo tiene un id y ningún atributo de nombre.


El ayudante primero buscará valores POSTed y los usará. Cuando publique el formulario, recuperará el valor anterior de la ID. Su solución alternativa es correcta.