2012-01-04 11 views
5

Requirment: Ho un elenco a discesa sulla mia pagina di visualizzazione, visualizzando un elenco di fornitori. Quando un fornitore è selezionato dal menu a discesa, la pagina visualizza i dettagli del fornitore selezionato. Di default ho bisogno di mantenere il primo fornitore selezionato e i suoi dettagli visualizzati. Potrei realizzare questo utilizzando il seguente codice.Indietro automatico in mvc menu a discesa

Problema: non so come eseguire autopostback = true in MVC. Devo visualizzare i dettagli del fornitore selezionato sulla selezione del fornitore nell'elenco a discesa.

Sto usando ASP.net 4.0, MVC3, Entity Framework 4.0. Ecco il mio codice:

[AcceptVerbs("POST")] 
    public ActionResult SearchResult(FormCollection collection) 
    { 
     try 
     { 
      string vendorName = collection["searchItem"].ToString(); 

      vendorName = vendorName.Trim(); 
      List<Vendor> vendorList = Queries.compiledVendorQuery(dbContext, vendorName).ToList<Vendor>(); 

      if(vendorList.Count() == 0) 
       return View("EmptySearch"); 

      List<SelectListItem> vendorSelectList = new List<SelectListItem>(); 
      foreach (Vendor vendor in vendorList) 
      { 
       vendorSelectList.Add(new SelectListItem 
       { 
        Text = vendor.vendorName.ToString(), 
        Value = vendor.vendorId.ToString() 
       }); 
      } 

      Vendor selectedVendor = vendorList[0]; 

      VendorDetails vendorDeatils = Queries.compiledVendorDetailsQuery(dbContext, selectedVendor.vendorId.ToString()).FirstOrDefault(); 

      VendorResult vendorResult = new VendorResult(); 

      vendorResult.vendorSelectList = vendorSelectList; 
      vendorResult.vendorDetails = vendorDeatils; 

      return View(vendorResult); 
     } 
     catch (Exception e) 
     { 
      return View("EmptySearch"); 
     } 
    } 


public class VendorResult 
{ 
    public List<SelectListItem> vendorSelectList { get; set; } 
    public VendorDetails vendorDetails {get; set;} 
} 


public class VendorDetails 
{ 
    public string vendorId { get; set; } 
    public string vendorName { get; set; } 
    public string address1 { get; set; } 
    public string address2 { get; set; } 
    public string address3 { get; set; } 
    public string city { get; set; } 
    public string state { get; set; } 
    public string zip { get; set; } 
    public decimal noteIndex { get; set; } 
    public string comment1 { get; set; } 
    public string comment2 { get; set; } 
    public string phone { get; set; } 
    public string interPhone { get; set; } 
    public string fax { get; set; } 
    public string interFax { get; set; } 
} 

Modifica: codice che definisce il mio elenco a discesa.

@model KeleTools.Models.VendorResult 

@{ 
    ViewBag.Title = "Vendor LookUp Tool"; 
    Layout = "~/Views/Shared/_ResultLayout.cshtml"; 
} 

<h2>Vendor Details</h2> 

<p> Select a vendor to display details:</p> 

@Html.DropDownList("VendorList", @Model.vendorSelectList, null, new {target="_self"}) 

@using (Html.BeginForm("SearchResult", "VendorLookUp")) 
{ 
    <div class="margin-10-top" > 
    <table id= "OrderDetail" class="OrderDetail"> 
    <tr class="OrderDetail"> 
     <td class="PropertyName">Vendor Id:</td> 
     <td class="PropertyValue">@Model.vendorDetails.vendorId.ToString().Trim()</td> 
    </tr> 
    <tr class="OrderDetail"> 
     <td class="PropertyName">Vendor Name:</td> 
     <td class="PropertyValue">@Model.vendorDetails.vendorName.ToString().Trim()</td> 
    </tr> 
    @{ 
          string address = @Model.vendorDetails.address1.ToString().Trim(); 
          address = address + "\n"; 
          address = address + @Model.vendorDetails.address2.ToString().Trim(); 
          address = address + "\n"; 
          address = address + @Model.vendorDetails.address3.ToString().Trim(); 

     <tr class="OrderDetail"> 
      <td class="PropertyName">Address</td> 
      <td class="PropertyValue">@address.TrimEnd()</td> 
     </tr> 
    } 
    @{ 
           string city = @Model.vendorDetails.city.ToString().TrimEnd(); 
           city = city + ", "; 
           city = city + @Model.vendorDetails.state.ToString().Trim(); 
           city = city + " "; 
           city = city + @Model.vendorDetails.zip.ToString().Trim(); 

     <tr class="OrderDetail"> 
      <td class="PropertyName">&nbsp;</td> 
      <td class="PropertyValue">@city</td> 
     </tr> 

           string phoneNumber = null; 
           if (!string.IsNullOrEmpty(@Model.vendorDetails.phone.ToString().Trim())) 
           { 
            phoneNumber = @Model.vendorDetails.phone.ToString().TrimEnd().Substring(0, 3); 
            phoneNumber = phoneNumber + "-"; 
            phoneNumber = phoneNumber + @Model.vendorDetails.phone.ToString().TrimEnd().Substring(3, 3); 
            phoneNumber = phoneNumber + "-"; 
            phoneNumber = phoneNumber + @Model.vendorDetails.phone.ToString().TrimEnd().Substring(6, 4); 
            if (@Model.vendorDetails.phone.ToString().Trim().Length > 10) 
            { 
             phoneNumber = phoneNumber + " Ext: "; 
             phoneNumber = phoneNumber + @Model.vendorDetails.phone.ToString().TrimEnd().Substring(10); 
            } 
           } 

     <tr class="OrderDetail"> 
      <td class="PropertyName">Phone Number:</td> 
      <td class="PropertyValue">@phoneNumber</td> 
     </tr> 
           phoneNumber = null; 
           if (!string.IsNullOrEmpty(@Model.vendorDetails.fax.ToString().Trim())) 
           { 
            phoneNumber = @Model.vendorDetails.fax.ToString().TrimEnd().Substring(0, 3); 
            phoneNumber = phoneNumber + "-"; 
            phoneNumber = phoneNumber + @Model.vendorDetails.fax.ToString().TrimEnd().Substring(3, 3); 
            phoneNumber = phoneNumber + "-"; 
            phoneNumber = phoneNumber + @Model.vendorDetails.fax.ToString().TrimEnd().Substring(6, 4); 
            if (@Model.vendorDetails.fax.ToString().Trim().Length > 10) 
            { 
             phoneNumber = phoneNumber + " Ext: "; 
             phoneNumber = phoneNumber + @Model.vendorDetails.fax.ToString().TrimEnd().Substring(10); 
            } 
           } 

     <tr class="OrderDetail"> 
      <td class="PropertyName">Fax:</td> 
      <td class="PropertyValue">@phoneNumber</td> 
     </tr> 
           phoneNumber = null; 
           if (!string.IsNullOrEmpty(@Model.vendorDetails.interPhone.ToString().Trim())) 
           { 

            phoneNumber = @Model.vendorDetails.interPhone.ToString().TrimEnd().Substring(0, 3); 
            phoneNumber = phoneNumber + "-"; 
            phoneNumber = phoneNumber + @Model.vendorDetails.interPhone.ToString().TrimEnd().Substring(3, 3); 
            phoneNumber = phoneNumber + "-"; 
            phoneNumber = phoneNumber + @Model.vendorDetails.interPhone.ToString().TrimEnd().Substring(6, 4); 
            if (@Model.vendorDetails.interPhone.ToString().Trim().Length > 10) 
            { 
             phoneNumber = phoneNumber + " Ext: "; 
             phoneNumber = phoneNumber + @Model.vendorDetails.interPhone.ToString().TrimEnd().Substring(10); 
            } 
           } 

     <tr class="OrderDetail"> 
      <td class="PropertyName">International Phone:</td> 
      <td class="PropertyValue">@phoneNumber</td> 
     </tr> 
           phoneNumber = null; 
           if (!string.IsNullOrEmpty(@Model.vendorDetails.interFax.ToString().Trim())) 
           { 
            phoneNumber = @Model.vendorDetails.interFax.ToString().TrimEnd().Substring(0, 3); 
            phoneNumber = phoneNumber + "-"; 
            phoneNumber = phoneNumber + @Model.vendorDetails.interFax.ToString().TrimEnd().Substring(3, 3); 
            phoneNumber = phoneNumber + "-"; 
            phoneNumber = phoneNumber + @Model.vendorDetails.interFax.ToString().TrimEnd().Substring(6, 4); 
            if (@Model.vendorDetails.interFax.ToString().Trim().Length > 10) 
            { 
             phoneNumber = phoneNumber + " Ext: "; 
             phoneNumber = phoneNumber + @Model.vendorDetails.interFax.ToString().TrimEnd().Substring(10); 
            } 
           } 

     <tr class="OrderDetail"> 
      <td class="PropertyName">International Fax:</td> 
      <td class="PropertyValue">@phoneNumber</td> 
     </tr> 
     } 
     <tr class="OrderDetail"> 
     <td class="PropertyName">Comment 1:</td> 
     <td class="PropertyValue">@Model.vendorDetails.comment1.ToString().TrimEnd() < /td> 
    < /tr> 
    <tr class="OrderDetail"> 
     <td class="PropertyName">Comment 2:</td> 
     <td class="PropertyValue">@Model.vendorDetails.comment2.ToString().Trim()</td> 
    < /tr> 

< /table> 
< /div> 
} 
+0

correlati : [Come si fa la funzione di autopostback dei moduli web in asp.net mvc?] (Http://stackoverflow.com/questions/7584515/how-do-you-do-autopostback-feature-of-webforms-in-asp- net-mvc/7584657 # 7584657) – vcsjones

+0

Come parte, vorrei spostare tutti i 'i f() {} 'logica nel modello di vista come una proprietà. –

risposta

8

Non c'è AutoPostback=true in MVC. Dovrai collegarlo da solo. Si può fare qualcosa di simile, utilizzando jQuery:

$("#idOfMyDropDownList").change(function() { 
    // Handle the change event, such as fire off an ajax request. 
}); 
+0

mi dispiace ragazzi, sono un po 'nuovo per jquery, ajax, mvc. Alcuni altri dettagli saranno apprezzati. – 14578446

2

Supponendo che sarà necessario fare un database colpire per ottenere i risultati, all'interno funzione jQuery James D'Angelo'a si dovrebbe poi fare un .post sul fornitore dettagli sul metodo nel tuo controller per riavere il tuo oggetto e poi compili i dettagli per il venditore selezionato alla pagina. Si dovrà aggiungere un metodo al controller che restituisce un oggetto JSON

$.post("/{Controller}/{Method}", { VendorId: selectVal }, function(response, status) { 
    var vendorDetails = eval("(" + response + ")"); 
    //additional code to populate the fields 
14

Cambiare la discesa di un'istanza a questo

@Html.DropDownList("VendorList", @Model.vendorSelectList, new { onchange = "$(this).parent('form:first').submit();" }}) 
+9

+1 per fornire il codice per l'esecuzione di un postback effettivo. Tuttavia, preferisco usare '$ (this) .closest (" form "). Submit();' per assicurarsi che il modulo all'interno del quale risiede l'elemento select, venga pubblicato. –

6

Si può fare in questo modo:

@Html.DropDownList("VendorList", @Model.vendorSelectList, "--Select Vendor--", new { @onchange = "this.form.submit();" })