para imagen emplea atributo c# asp.net webforms controls model-binding

c# - imagen - Enlace de modelo de formularios web: ¿Cómo omitir el enlace para el control no visible?



atributo title de la imagen (1)

Estoy usando la nueva función de vinculación de modelos para los formularios web, con .NET Framework versión 4.5.1. Lo que espero lograr es excluir algunas de las vinculaciones de dos vías, basadas en algunas condiciones.

Me gusta mucho la serie de publicaciones de blog (con suerte ahora famosa) , de Scott Guthrie . Implemento una página de edición utilizando el enfoque número dos de la Parte 3 del Enlace de modelos de formularios web: Actualización y validación (Serie ASP.NET 4.5)

Esto es lo que tengo: (simplificado, en ElementEdit.aspx):

<asp:FormView runat="server" ID="FormViewElement" RenderOuterTable="false" DefaultMode="Edit" DataKeyNames="ElementId" ItemType="Business.Entities.Element" SelectMethod="GetElement" UpdateMethod="UpdateElement"> <EditItemTemplate> <asp:Panel runat="server" DefaultButton="ButtonSpeichern"> <fieldset> /*some databound controls*/ <asp:Panel runat="server" Visible="<%# !Item.CurrentElementData.SomeCondition() %>"> /*more databound controls*/ </asp:Panel> /*the submit button ("ButtonSpeichern")*/ </fieldset> </asp:Panel> </EditItemTemplate> </asp:FormView>

Como puede ver, hay una condición para la visibilidad en el panel interno envuelto con "más controles de base de datos". Estos deben vincularse solo cuando la condición es verdadera y son visibles. De lo contrario no deberían enlazar y no cambiar los valores.

La actualización funciona como en la publicación de Scott (simplificada, en xxPage.cs), que es una clase base genérica de Elemento de tipo:

protected virtual bool UpdateEntity(int id) { T existing = UseCase.GetItem(id); //gets the original element TryUpdateModel(existing); //SHOULD NOT update the invisible databound controls, but does ValidateExistingEntity(existing); if (ModelState.IsValid) { UseCase.Update(existing); return true; } ShowErrors(ModelState); return false; }

Aquí, después de la llamada a TryUpdateModel() , los controles invisibles han actualizado el modelo, que es lo que quería evitar.

¿Cómo omitir dinámicamente el enlace de datos para algunos elementos, en función de una condición, aunque configurarlos como invisibles no ayuda?

ACTUALIZACIÓN: Ahora he creado una solución alternativa que me resuelve el problema hoy: simplemente he creado dos páginas .aspx con su código respectivo detrás. Dependiendo de los campos que el usuario deba editar con éxito, en primer lugar llamo a la página correspondiente.

Sin embargo, esto no resuelve el problema subyacente, que es el enlace de datos condicional.


Esto es más un algoritmo que una solución codificada.

Me gusta usar una clase separada, por ejemplo MyData.cs, ​​para administrar mis actualizaciones de datos y pasar elementos de la interfaz de usuario a través de los métodos de esta clase. Soy como procedimientos almacenados, pero puede crear consultas dentro de su proyecto.

Si hay una variación entre los controles que son visibles y no, yo recomendaría:

MyBindingMethod(array[] of the controls){ // Loop through array updating data. // Or loop through array and call a second method to update the data. }

Dinámicamente puede verificar la visibilidad de los controles y luego agregarlos a la matriz o no para pasar al método de enlace.

Si los controles que cambian de visibilidad son constantes, puede usar dos métodos separados, para actualizar selectivamente:

MyBindingMethodAll(){ // Update all controls. } MyBindingMethodVisible(){ // Update controls that remain visible. }

Luego, llame a los métodos de MyData.cs desde su aspx.cs. El truco es mantener el control de su enlace de datos dentro de su C # y puede determinar exactamente qué se actualiza, dónde y cuándo.

Me complace proporcionarle un ejemplo de trabajo más detallado, si puede proporcionar más código.

Editar actualización para ayudar a aclarar la solución

Al utilizar una clase separada para administrar el enlace de datos, el elemento de visualización se puede pasar a un método de esta clase separada. He utilizado procedimientos almacenados.

clase ManageData

public static void SelectAllSomething(DropDownList list) { // Clear any previously bound items. list.Items.Clear(); // SqlConnection. SqlConnection con = new SqlConnection(conString); // Create new command and parameterise. SqlCommand cmd = new SqlCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "MyStoredProcedure"; cmd.Connection = con; try { // Open connection and bind data to GUI. con.Open(); list.DataSource = cmd.ExecuteReader(); list.DataTextField = "Name"; list.DataValueField = "ID"; list.DataBind(); } catch (Exception ex) { throw ex; } finally { con.Close(); con.Dispose(); } }

Desde aspx.cs, llame al método desde la clase ManageData.

ManageData.SelectAllCat(MyDropDownList);

Usando este mismo principio.
Sin ver tu diseño solo puedo darte un ejemplo conceptual.

  • Si tienes TextBoxes quieres controlar.

TextBox1, TextBox2, TextBox3, ... /

public static void AddText(List<TextBox> MyTextBoxes) { for(int i=0; i<MyTextBoxes.Count();i++){ MyTextBoxes.[i].Text = // What means you are using. } }

Desde el aspx.cs

public List<TextBox> FindVisibleTextBoxes(){ List<TextBox> MyTextBoxes = new List<TextBox>(); if(TextBox1.Visible== true){ MyTextBoxes.Add(TextBox1); } return MyTextBoxes; }

Pase la lista del cuadro de texto al método desde ManageData.

Esto se puede modular mejor, según sus necesidades y puede pasar más de una Lista o una Lista de Objetos para pasar a través de una mezcla heterogénea de controles.

Este es solo un concepto, hay muchas maneras de hacer las cosas. Espero que encuentres esto útil para desarrollar más formas de resolver tu dilema.