2011-01-18 16 views
8

ho creato visualizzazione di una pagina in MVC comePulsante Evento in ASP.NET MVC

<%using (Html.BeginForm()) 
{ %> 
    <%=LabelHelpers.Label("firstname", "FirstName:")%> 
    <br/> 
    <%=Html.TextBox("firstname")%> 
    <br/><br/> 
    <%=LabelHelpers.Label("lastname", "Lastname:")%> 
    <br/> 
    <%=Html.TextBox("lastname")%> 
    <br/><br/> 
    <input type="Button" value="Register"/> 
<%} %> 

Qui voglio scrivere ButtonClick evento ... Come e dove dovrei scrivere?

risposta

12

L'input è di tipo button - questi non fanno nulla senza codice lato client aggiuntivo.

Se si desidera gestire l''evento' sul server in modo simile a quello che si avrebbe in ASP.NET, è necessario convertirlo in un pulsante di invio. Supponendo che il controller si chiama 'Account' e la vostra azione si chiama 'Registra' tuo attuale codice apparirebbe qualcosa come questo:

public ViewResult Register() 
{ 
    return View(); 
} 

si desidera avviare passando un modello per la vista:

public ViewResult Register() 
{ 
    var registerModel = new RegisterModel(); 

    return View(registerModel); 
} 

La vista corrente utilizza input con caratteri generici. Dal momento che stai trasmettendo un modello puoi utilizzare viste fortemente tipizzate. Il modello dovrebbe essere simile a questa:

public class RegisterMode 
{ 
    public string Firstname { get; set; } 
    public string Surname { get; set; } 
} 

Per utilizzare una vista fortemente tipizzati, modificare l'immagine per apparire come segue:

<%using (Html.BeginForm()) 
{ %> 
    <%=Html.LabelFor(x => x.Firstname)%> 
    <br/> 
    <%=Html.TextBoxFor(x => x.Firstname)%> 
    <br/><br/> 
    <%=Html.LabelFor(x => x.Surname)%> 
    <br/> 
    <%=Html.TextBoxFor(x => x.Surname)%> 
    <br/><br/> 
    <input type="submit" value="Register"/> 
<%} %> 

Quello che abbiamo fatto è detto al fine di costruire le etichette e il testo scatole per il tuo tipo RegisterModel. Ciò consentirà di mappare automaticamente i valori del modello quando si esegue il POST del modulo sul controller.

fare accettare l'incarico, abbiamo bisogno di aggiungere una nuova azione al controller, con lo stesso nome, ma accettando un parametro di tipo RegisterModel:

public ActionResult Register(RegisterModel model) 
{ 
    // do something with the model, such as inserting it into the database. 
    // model.Firstname will contain the value of the firstname textbox 
    // model.Surname will contain the value of the surnaem textbox 

    return RedirectToAction("Success"); 
} 

Un'ultima cosa da fare, per essere sicuri, è quello di aggiungere gli attributi [HttpGet] e [HttpPost] alle vostre azioni di controllo per controllare i metodi che accettano:

[HttpGet] 
public ViewResult Register() 

e

[HttpPost] 
public ActionResult Register(RegisterModel model) 

Ti suggerisco di leggere su MVC allo http://www.asp.net/mvc e leggere il capitolo tutorial di NerdDinner in Professional MVC (disponibile gratuitamente online in formato PDF).

1

unirsi alla domanda, vogliamo rendere più concreto

Ho una forma, la forma ha già un pulsante di invio, ma ho bisogno di legare un'azione aggiuntiva per un altro pulsante. sì, so che MVC non supporta gli eventi perché i moduli HTML non li supportano.

quindi la soluzione a cui sono arrivato è creare input nascosti all'interno del modulo e associare un evento 'onclick' (metodo jquery 'live') a tutti ... oh, che diavolo?ecco il codice:

html:

<input type="hidden" id="SenderControlID" name="SenderControlID" value="-1" /> 
<input type="hidden" id="SenderControlValue" name="SenderControlValue" value="-1" /> 

JS:

if ($('#SenderControlID')[0]) { 
     $('input[type="submit"], input[type="button"], input[type="checkbox"], input[type="radio"]').live('click', function() { 
      $('#SenderControlID').val($(this).attr('name')); 
      $('#SenderControlValue').val($(this).val()); 
     }); 
    } 

ma forse c'è una soluzione più elegante?