Presentatore che accede al valore nella casella di testo usando l'oggetto mittente

1

Ho il seguente metodo nei miei presentatori che convalida gli input dell'utente sull'interfaccia utente. Fondamentalmente per acquisire il valore della proprietà text della casella di testo, utilizza l'oggetto mittente che è stato passato dall'evento fire nel modulo.

PRESENTATORE

_View.ValidateInPut += new EventHandler(_View_ValidateInPut);

private void _View_ValidateInPut(object sender,  EventArgs e)
{
    var controller = (TextBox)sender;
    var text = controller.Text;

    If (text is InValid)
    MessageBox.Show ("The value in the Text box is invalid");

}

Visualizza

private void txtACNo_Validating(object sender, CancelEventArgs e)
{
    ValidateInPut(sender, e); // Firing the event
}

Questo porterà a errori imprevisti?

Se sì, per favore fammi sapere un modo migliore per farlo?

    
posta CAD 15.06.2014 - 14:14
fonte

1 risposta

2

Non penso che sia una saggia idea avere View e Presenter accoppiati così stretti.

In base alla schermata passiva oppure Supervisore Presentatore il relatore e la vista sono separati da un'interfaccia implementata dalla vista. Il presentatore chiama l'interfaccia. Ecco un esempio di un relatore supervisore.

PRESENTATORE

questa classe non ha dipendenza dalla libreria della GUI usata

public class Presenter 
{
    IView view;
    public Presenter(IView view)
    {
        this.view = view;
    }

    public void ValidateInPut(string value)
    {
        if (!String.IsEmptyOrNull(value) && value.Contains("9")) 
        {  
           view.ShowError("The value in the Text box is invalid");
        }
    }
}

ViewInterface

public inteface IView
{
    void ShowError(string message);
}

Visualizza

public class Form1:Form, IView
{
    private Presenter presenter;
    public Form1()
    {
         this.presenter = new Presenter(this); // or have a Dependcy Injection Framework do this
    }

    private void txtACNo_Validating(object sender, CancelEventArgs e)
    {
        presenter.ValidateInPut(txtACNo); // validate
    }

    public void IView.ShowError(string message);
    {
        MessageBox.Show(mesage);
    }
}

Motivazioni

Utilizzando la vista e il presentatore, il relatore (con tutta la sua logica (busines)) diventa facilmente testabile o la visualizzazione può essere sostituita da una pagina Web senza la necessità di adattare la logica del relatore.

test

public class Test:IView
{
    bool showErrorCalled = false;

    public void Test()
    {  
       var p = new Presenter(this);
       showErrorCalled = false;
       p.ValidateInput("8");
       Test.Assert(showErrrocalled);
    }

    public void IView.ShowError(string message);
    {
        showErrorCalled = true;
    }
}

pagina web

public Default:Page, IView
{
      private Presenter presenter;
      public Default()
      {
          this.presenter = new Presenter(this);
      }

      public Page_Load(object sender, EventArgs e)
      {
          if (IsPostBack)
          {
               presenter.ValidateInput(txtAcNo.Text);
          }
      }

      public void IView.ShowError(string message);
      {
          Error.Text = message;
      }

}

PS

Ricorda che l'operatore di cast su un oggetto potrebbe fallire. Il tuo codice

var controller = (TextBox)sender;

funzionerà solo finché sender è un TextBox . È meglio controllare se esiste un tipo più generalizzato nella gerarchia che fornisce ancora l'interfaccia necessaria. Nel tuo caso potrebbe essere Control che ha anche una proprietà Text . Un approccio più difensivo sarebbe:

var controller = sender as Control; // try to cast, if not return null
if (controller != null) 
{
     // do stuff with controller
}
else
{
    // logging
    Debug.WriteLine("controller is null");
}
    
risposta data 20.06.2014 - 22:17
fonte

Leggi altre domande sui tag