2012-01-05 7 views
11
public ActionResult SomeAction(int Id){ 
    //Id is set to 2 

    var model = //get some thing from db using Id(2); 
    //Now model.Id is set to 9; 

    return View(model); 
} 

----------View---------- 
@Html.HiddenFor(x => x.Id) 

Cuando veo fuente de este campo oculto se establece en 2, no 9. ¿Cómo llego a mapa al modelo vez de mapeo a la información de enrutamiento de URL?HiddenFor (x => x.Id) está siendo poblada por los UrlParameter en lugar del modelo de vista

P.S. Prefiero no cambiar el nombre de los parámetros porque luego pierdo mi apariencia agradable a menos que cambie la información de enrutamiento. Lo hice y funciona, pero no es lo que quiero.

+0

Me parece que no está configurando correctamente el valor del modelo antes de representar la vista. Esa parece ser la única forma de describir lo que estás viendo. –

+0

¿Has intentado poner un @model en tu vista? –

+0

Sí, tengo varios otros "HiddenFor" en la vista que están mapeando correctamente al modelo. Solo este está mapeando incorrectamente. después de cambiar el nombre del parámetro de la acción de id a x_id funcionó bien. Pero mi URL pasó de "/ account/2" a "/ account? X_id = 2". –

Respuesta

24

Cuando un Action es llamado el marco construye un ModelStateCollection basado en los valores de cadena de consulta, posterior a los datos, los valores de enrutamiento etc. Y esto ModelStateCollection se pasará a la View. Todos los ayudantes de entrada de HTML intentan obtener los valores del ModelStateCollectionprimero, antes de tratar de obtener los valores del modelo real.

Debido a que su modelo de entrada es la int id pero el modelo de salida es algún modelo nuevo los ayudantes usarán los valores de la ModelStateCollection (de la cadena de consulta) porque los nombres son propery Id partido.

para que funcione hay que borrar manualmente el ModelStateCollection antes de devolver el nuevo modelo a la vista:

public ActionResult SomeAction(int Id){ 
    //Id is set to 2 

    ModelState.Clear(); 

    var model = //get some thing from db using Id(2); 
    //Now model.Id is set to 9; 

    return View(model); 
} 
+2

Gracias, eres un caballero y un erudito. –

+1

buena llamada; sin embargo, tenga cuidado al borrar el estado del modelo en caso de que haya algo en él que necesite (una razón para considerar el nombre del parámetro diff o el nombre del modelo aquí) –

+0

Esto lo explica en detalle: http: //blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx –

4

Usted podría intentar esto más adelante

<input id="Id" type="hidden" value="@Model.Id" /> 

Puede que no sea exactamente lo que quiere, pero esencialmente hace lo mismo.

+0

Creo que esto también habría funcionado, gracias. –

0

Puede utilizar TextBoxFor y hacer que oculta el uso de CSS como

@Html.TextBoxFor(x => x.Id, new { @style="visibility:hidden; width:4px;"}) 

Se trabajó para mi.

Cuestiones relacionadas