asp.net-mvc-3 - tutorial - instalar asp net mvc
en evento de cambio de selección-Html.DropDownListFor (3)
Podemos usar el jquery para obtener y completar el menú desplegable de esta manera:
<script>
function FillCity() {
var stateId = $(''#State'').val();
$.ajax({
url: ''/Employees/FillCity'',
type: "GET",
dataType: "JSON",
data: { State: stateId},
success: function (cities) {
$("#City").html(""); // clear before appending new list
$.each(cities, function (i, city) {
$("#City").append(
$(''<option></option>'').val(city.CityId).html(city.CityName));
});
}
});
}
</script>
Para obtener más detalles, vea MVC DropDownListPara completar el cambio de selección de otro menú desplegable
Tengo dos listas desplegables. El valor seleccionado del primero carga el otro. ¿Cómo hago eso cuando tengo los métodos de ayuda en un controlador?
@using (Html.BeginForm())
{
<div>
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td><b>Select a District:</b></td>
<td>@Html.DropDownListFor(m => m.DistrictId, ViewData["DMManagers"] as IEnumerable<SelectListItem>, "Select One")</td>
</tr>
<tr>
<td><b>Select a TM:</b></td>
<td>@Html.DropDownListFor(m => m.TMId, ViewData["TMManagers"] as IEnumerable<SelectListItem>, "Select One")</td>
</tr>
</table>
</div>
}
private void LoadDistrictManagers()
{
var _DMS = (from c in SessionHandler.CurrentContext.ChannelGroups
join cgt in SessionHandler.CurrentContext.ChannelGroupTypes on c.ChannelGroupTypeId equals cgt.ChannelGroupTypeId
where cgt.Name == "District Manager"
select new { c.ChannelGroupId, c.Name }).OrderBy(m => m.Name);
ViewData["DMManagers"] = new SelectList(_DMS, "ChannelGroupId", "Name");
}
private void LoadTerritoryManagers(int districtId)
{
var _TMS = (from c in SessionHandler.CurrentContext.ChannelGroups
join cgt in SessionHandler.CurrentContext.ChannelGroupTypes on c.ChannelGroupTypeId equals cgt.ChannelGroupTypeId
where cgt.Name == "Territory" && c.ParentChannelGroupId == districtId
select new { c.ChannelGroupId, c.Name }).OrderBy(m => m.Name);
ViewData["TMManagers"] = new SelectList(_TMS, "ChannelGroupId", "Name");
}
public ActionResult SummaryReport()
{
DistrictManagerModel model = new DistrictManagerModel();
LoadDistrictManagers();
return View("AreaManager", model);
}
Proporcione a ambos desplegables identificadores únicos usando el campo HTTPAttributes:
@Html.DropDownListFor(m => m.DistrictId, ViewData["DMManagers"] as IEnumerable<SelectListItem>, "Select One", new {@id="ddlDMManagers"})
El segundo menú desplegable debe inicializarse como una lista vacía:
@Html.DropDownListFor(m => m.TMId, Enumerable.Empty<SelectListItem>(), new {@id="ddlTMManagers"})
Si no te importa usar jQuery ajax para actualizar el segundo menú desplegable cuando se desencadena un evento de ''cambio'' en el primer menú desplegable:
$(function() {
$(''select#ddlDMManagers'').change(function() {
var districtId = $(this).val();
$.ajax({
url: ''LoadTerritoryManagers'',
type: ''POST'',
data: JSON.stringify({ districtId: districtId }),
dataType: ''json'',
contentType: ''application/json'',
success: function (data) {
$.each(data, function (key, TMManagers) {
$(''select#ddlTMManagers'').append(''<option value="0">Select One</option>'');
// loop through the TM Managers and fill the dropdown
$.each(TMManagers, function(index, manager) {
$(''select#ddlTMManagers'').append(
''<option value="'' + manager.Id + ''">''
+ manager.Name +
''</option>'');
});
});
}
});
});
});
Agregue esta clase al espacio de nombres de su controlador:
public class TMManager
{
public int Id {get; set;}
public string Name {get; set;}
}
Necesitará actualizar su acción de controlador, LoadTerritoryManagers (), para responder a la solicitud ajax y devolver una matriz JSON de objetos {Id, Name}.
[HttpPost]
public ActionResult LoadTerritoryManagers(int districtId)
{
var _TMS = (from c in SessionHandler.CurrentContext.ChannelGroups
join cgt in SessionHandler.CurrentContext.ChannelGroupTypes on c.ChannelGroupTypeId equals cgt.ChannelGroupTypeId
where cgt.Name == "Territory" && c.ParentChannelGroupId == districtId
select new TMManager(){ Id = c.ChannelGroupId, Name = c.Name }).OrderBy(m => m.Name);
if (_TMS == null)
return Json(null);
List<TMManager> managers = (List<TMManager>)_TMS.ToList();
return Json(managers);
}
Usa el siguiente código Se usa en mi proyecto. Para Zona y Región, utilicé dos listas desplegables. Al cambiar los datos de la Zona, cargué el menú desplegable Región.
En la página Ver
@Html.DropDownList("ddlZone", new SelectList(@ViewBag.Zone, "Zone_Code", "Zone_Name"), "--Select--", new { @class = "LoginDropDown" })
@Html.DropDownList("ddlRegion", Enumerable.Empty<SelectListItem>(), new { @class = "LoginDropDown" })
La zona debe cargarse cuando la página de vista está cargada.
En el controlador escribe este método para carga de región
[WebMethod]
public JsonResult LoadRegion(string zoneCode)
{
ArrayList arl = new ArrayList();
RASolarERPData objDal = new RASolarERPData();
List<tbl_Region> region = new List<tbl_Region>();
region = erpDal.RegionByZoneCode(zoneCode);
foreach (tbl_Region rg in region)
{
arl.Add(new { Value = rg.Reg_Code.ToString(), Display = rg.Reg_Name });
}
return new JsonResult { Data = arl };
}
Luego use el siguiente JavaScript
<script type="text/javascript">
$(document).ready(function () {
$(''#ddlZone'').change(function () {
LoadRegion(this.value);
});
function LoadRegion(zoneCode) {
$.ajax({
type: "POST",
url: ''@Url.Action("LoadRegion", "RSFSecurity")'',
data: "{''zoneCode'':''" + zoneCode + "''}",
contentType: "application/json; charset=utf-8",
dataType: ''json'',
cache: false,
success: function (data) {
$(''#ddlRegion'').get(0).options.length = 0;
$(''#ddlRegion'').get(0).options[0] = new Option("--Select--", "0");
$.map(data, function (item) {
$(''#ddlRegion'').get(0).options[$(''#ddlRegion'').get(0).options.length] = new Option(item.Display, item.Value);
});
},
error: function () {
alert("Failed to load Item");
}
});
}
});
</script>