2012-08-01 2 views
1

У меня есть поле для почтового индекса. Я хочу, чтобы, когда человек заполняет это поле почтовым индексом и щелкает в другом поле, запускает событие (onBlur). Это событие выполнит выбор в базе данных и получит адрес и заполнит другие поля этой информацией. Я читал, что не очень хорошая идея выполнить метод контроллера из представления. Итак, как я могу это развить?MVC 3 .NET заполняет поля динамически

Мой почтовый поле Код:

<div class="editor-field"> 
    @Html.Label("ZIP CODE") 
    @Html.Editor("zipCodeClient") 
</div> 

Спасибо!

+1

Вы должны использовать Javascript и AJAX. – SLaks

+0

Взгляните на: [knockoutjs] (http://knockoutjs.com/) и [нокаут MVC] (http://knockoutmvc.com/) – Jupaol

ответ

1

Если у вас есть доступ к jQuery, я бы использовал функцию ajax для вызова веб-службы wcf, которая возвращает соответствующую адресную информацию в формате JSON. В противном случае вы можете создать свой собственный запрос XHR и проанализировать ответ.

$('#zipCodeClient').blur(function() { 
    var zipCode = $(this).val(); 
    if(zipCode.length >= 5 && zipCode.length <= 10) { 
     $.ajax({ 
      type: 'GET', 
      data: { ZipCode: zipCode }, 
      url: 'something/ZipCodeToAddressService', 
      dataType: 'json', 
      contentType: 'application/json; charset=utf-8', 
      success: function(data) { 
       var responseObject = jQuery.parseJSON(data); 
       $('#cityTextBox').val(responseObject.City); 
       $('#stateTextBox').val(responseObject.State); 
      } 
     }); 
    } 
    else { 
     // zip code not valid 
    } 
}); 

В WCF:

[ServiceContract()] 
public interface IAddressServices 
{ 
    [OperationContract()] 
    [WebGet(ResponseFormat = WebMessageFormat.Json)] 
    string ZipCodeToAddressService(string ZipCode); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class AddressServices : IAddressServices 
{ 
    public string ZipCodeToAddressService(string ZipCode) 
    { 
     using (SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString)) 
     { 
      using (SqlCommand sqlCmd = new SqlCommand("ZipCodeToAddressStoredProc", sqlConnection)) 
      { 
       sqlCmd.CommandType = CommandType.StoredProcedure; 
       sqlCmd.Parameters.Add("@Zip", SqlDbType.NVarChar).Value = ZipCode; 
       sqlConnection.Open(); 
       SqlDataReader sDR = sqlCmd.ExecuteReader(CommandBehavior.CloseConnection); 
       DataTable tbl = new DataTable(); 
       tbl.Load(sDR); 
       sDR.Close(); 
       var citystateData = from DataRow Row in tbl.AsEnumerable() 
            select new 
            { 
             City = Row.Field<string>("City"), 
             State = Row.Field<string>("State") 
            }; 
       JavaScriptSerializer js = new JavaScriptSerializer(); 
       StringBuilder sb = new StringBuilder(); 
       js.Serialize(cityStateData, sb); 
       string rtrnCityStateData = sb.ToString(); 
       return rtrnCityStateData; 
      } 
     } 
    } 
} 
+0

Привет! Спасибо за ваш ответ. Я использовал эту функцию, как вы, но просто показывая предупреждение на onBlur и не обнаружил :( $ ('# zipCodeClient'). OnBlur (function() { var zipCode = $ (this) .val(); alert («OnBlur!»); }); –

+0

.Net имеет странный способ назначения элементов управления идентификатором html. Когда вы находитесь в режиме отладки, откройте источник страницы в браузере и посмотрите, id - это текстовое поле, на которое вы пытаетесь захватить событие onBlur. Вероятно, это будет что-то странное, как $ ctl00_zipCodeClient - fun. – pwnyexpress

+0

Смежные вопросы