asp.net-mvc - una - select asp-for asp-items
Oculto para no obtener el valor correcto de la vista (3)
Asegúrese de que la propiedad modelo tenga un operador "conjunto".
Esto no se actualizará en post-back:
@ Html.HiddenFor (m => m.NoSeq)
public Class MyModel
{
int _NoSeq;
public NoSeq
{
get { return _NoSeq };
}
}
Tengo un proceso de importación de archivos de varios pasos. Tengo una entrada de formulario oculta en mi vista que intento rellenar con el "CurrentStep" del modelo de vista
<% = Html.HiddenFor(model => model.CurrentStep) %>
CurrentStep es un Enum y siempre obtengo el valor predeterminado en lugar del que proporcioné al modelo de vista. Por otro lado esto me da el valor correcto:
<p><% = Model.CurrentStep %></p>
Me doy cuenta de que solo podría codificar manualmente la entrada oculta, pero quiero saber: ¿qué estoy haciendo mal? ¿Hay una mejor manera de realizar un seguimiento del paso actual entre POSTs?
Lo que está haciendo mal es que está intentando modificar el valor de una variable POST en su acción del controlador. Así que supongo que estás tratando de hacer esto:
[HttpPost]
public ActionResult Foo(SomeModel model)
{
model.CurrentStep = Steps.SomeNewValue;
return View(model);
}
y html helpers como HiddenFor siempre usarán primero el valor POST y luego el valor en el modelo.
Así que tienes un par de posibilidades:
Eliminar el valor del estado de modelo:
[HttpPost] public ActionResult Foo(SomeModel model) { ModelState.Remove("CurrentStep"); model.CurrentStep = Steps.SomeNewValue; return View(model); }
Generar manualmente el campo oculto.
<input type="hidden" name="NextStep" value="<%= Model.CurrentStep %>" />
Escriba un ayudante personalizado que usará el valor de su modelo y no el que está siendo POSTADO
Mi solución fue usar la segunda opción de Darin, porque la opción 1 (borrar del estado del modelo) significa codificar una cadena (y la convención de nomenclatura puede ser complicada con los modelos complejos), y quería evitar la opción 3 porque ya tengo muchas personalizaciones ayudantes
<input type="hidden" name="@Html.NameFor(x => Model.SomeId)" value="@Model.SomeId" />
Solo un recordatorio de que puede usar Html.NameFor
para mantener todo limpio.