2011-07-06 19 views
5

estoy usando ASP.NET MVC 3 y tengo varias páginas en las que la mayoría de la vista del modelo es de sólo lectura. Un campo ejemplo sería como tales:ASP.NET MVC 3 - Las mejores prácticas para el manejo de Modelo en Ver

<div class="display-label">My Field</div> 
<div class="display-field">@Model.MyField</div> 

entonces tengo un campo donde el usuario tiene que escribir un texto de verificación de este modo:

@Html.LabelFor(model => model.Verification) 
@Html.PasswordFor(model => model.Verification) 

Cuando el usuario envía el formulario y golpea mi controlador, los campos de ViewModel son todos nulos, excepto el campo Verificación. La forma en que he tenido tiempo de esto, hasta el momento, es tener varios campos tales como: HiddenFor

@Html.HiddenFor(model => model.MyField) 

Sin embargo, esto se pone feo muy rápido. ¿Hay una mejor manera de manejar el modelo en el estado de la vista para que, durante el POST del envío del formulario, pueda obtener todos mis campos? Esto es importante en caso de que el texto de verificación no coincida durante el POST y necesito devolver el modelo de vista sin volver a recuperarlo de la base de datos.

Gracias por cualquier sugerencia.

Respuesta

3

No hay mejor manera de evitarlo sin volver a recuperar el valor de la base de datos. La razón se debe a que el modelo de MVC unión sólo se basa en los parámetros GET o POST para obligar a la MyField al modelo de la acción, y si los parámetros GET/POST no tienen un valor MyField entonces se tiene que mantener esa propiedad como nulo (¿de qué otra ¿va a saber cuál debe ser el valor?)

Para que el modelo de encuadernación vea su valor MyField es pasarlo en los parámetros GET/POST, y para ello debe indicar explícitamente el formulario de su vista a pase el valor en via Html.HiddenFor(). No hay forma de que la vista sepa automáticamente enviar esa propiedad en los parámetros de publicación/obtención.

Sin embargo una idea que puede tener en cuenta es crear un método de afeitar (o HTML) auxiliar que lleva un nombre de campo y una expresión (la x => x.MyField) y escribe el siguiente resultado para usted:

<div class="display-label">My Field</div> 
<div class="display-field">@Model.MyField</div> 
@Html.HiddenFor(model => model.MyField) 
.

esto significa que sólo tiene que escribir una línea de código (algo así como @Html.ShowReadOnlyField(x => x.MyField, "My Field") en lugar de esas 3 líneas Sin embargo, esto también supone que todo el mundo quiere hacer esto tendrá la misma estructura div

Editar:. Jus Tenga en cuenta las preocupaciones de seguridad sobre los campos de solo lectura, ya que no son realmente de solo lectura. Es mejor recuperar estos datos de la base de datos si estos datos se van a usar para cualquier cosa en el controlador. porque aunque solo se lea en el formulario HTML, los usuarios aún pueden establecer este valor en cualquier cosa que deseen manipulando los datos POST/GET.

+0

¿sería capaz de moverse por las preocupaciones de seguridad mediante el helper '@ Html.AntiForgeryToken()'? – Brandon

+1

lo dudo. No sé demasiado sobre la funcionalidad AntiForgeryToken, pero lo más probable es que el usuario pueda ver la fuente de la página para ver qué token necesitan para que funcione. El token de falsificación es más para ataques de scripts entre sitios, no para la protección del valor, y ahora hay forma de saber si un campo debe o no proporcionarse.Todo lo que debe ser seguro necesita ser manejado por el servidor, y no puede confiar en las características del lado del cliente para la seguridad – KallDrexx

+0

Terminé simplemente recargando mi instancia de objeto en el controlador. – Brandon

0

Por favor, intente serializar el modelo en la página y realice una Post? Esto deberia resolver el problema.

<%= Html.Serialize("User",Model) %> 

[HttpPost] 
public ActionResult Register([DeserializeAttribute] User user, FormCollection userForm) 
{ 

} 
+0

¡Hola ViewState! –

Cuestiones relacionadas