Craig
Craig

Reputation: 18704

Change DropDownList data with Javascript

I have a page where a user can select if the transaction type is an inter accounts transfer, or a payment.

The model I pass in had two lists. One is a list of SelectListItem One is a list of SelectListItem

One of the lists is populated like this:

var entities = new EntityService().GetEntityListByPortfolio();
foreach (var entity in entities.Where(x=>x.EntityTypeId == (int)Constants.EntityTypes.BankAccount))
{
    model.BankAccounts.Add(new SelectListItem
    {
        Value = entity.Id.ToString(CultureInfo.InvariantCulture),
        Text = entity.Description
    });
}

If the user selects 'Inter account transfer', I need to:

Populate DropdownA with the list from Accounts, and populate DropdownB with the same list of Accounts

If they select "Payment", then I need to change DrowdownB to a list of ThirdParty.

Is there a way, using javascript, to change the list sources, client side?

function changeDisplay() {
    var id = $('.cmbType').val();
    if (id == 1) // Payment
    {
        $('.lstSource'). ---- data from Model.ThirdParties
    } else {
        $('.lstSource'). ---- data from Model.Accounts
    }
}

I'd prefer not to do a call back, as I want it to be quick.

Upvotes: 2

Views: 5039

Answers (3)

Pratik Bhoir
Pratik Bhoir

Reputation: 2144

You can load the options by jquery
Code is Updated
Here is the code

You will get everything about Newton Json at http://json.codeplex.com/

C# CODE

//You need to import Newtonsoft.Json  
string jsonA = JsonConvert.SerializeObject(ThirdParties);
//Pass this jsonstring to the view by viewbag to the
Viewbag.jsonStringA = jsonA;

string jsonB = JsonConvert.SerializeObject(Accounts);
//Pass this jsonstring to the view by viewbag to the
Viewbag.jsonStringB = jsonB;

You will get a jsonstring like this

[{"value":"1","text":"option 1"},{"value":"2","text":"option 2"},{"value":"3","text":"option 3"}]

HTML CODE

<button onclick="loadListA();">Load A</button>
<button onclick="loadListB();">Load B</button>

<select name="" id="items">

</select>

JavaScript Code

function option(value,text){
     this.val= value;
    this.text = text;
}

var listA=[];
var listB=[];

//you just have to fill the listA and listB by razor Code
    //@foreach (var item in Model.ThirdParties)
    //{
    //    <text>
    //    listA.push(new option('@item.Value', '@item.Text'));
    //    </text>
   // }
    //@foreach (var item in Model.Accounts)
   // {
    //    <text>
   //     listA.push(new option('@item.Value', '@item.Text');
   //     </text>
   // }

listA.push(new option(1,"a"));
listA.push(new option(2,"b"));
listA.push(new option(3,"c"));

listB.push(new option(4,"x"));
listB.push(new option(5,"y"));
listB.push(new option(6,"z"));

function loadListA(){
    $("#items").empty();
    listA.forEach(function(obj) {
        $('#items').append( $('<option></option>').val(obj.val).html(obj.text) )
    });
}

function loadListB(){
    $("#items").empty();
    listB.forEach(function(obj) {
        $('#items').append( $('<option></option>').val(obj.val).html(obj.text) )
    });
}

NEW Javascript Code fpor Json

var listA=[];
var listB=[];
var jsonStringA ='[{"val":"1","text":"option 1"},{"val":"2","text":"option 2"},{"value":"3","text":"option 3"}]';
var jsonStringB ='[{"val":"4","text":"option 4"},{"val":"5","text":"option 5"},{"value":"6","text":"option 6"}]';

//you just have to fill the listA and listB by razor Code 
//var jsonStringA = '@Viewbag.jsonStringA';
//var jsonStringB = '@Viewbag.jsonStringB';

listA =  JSON.parse(jsonStringA);
listB =  JSON.parse(jsonStringB);

function loadListA(){
    $("#items").empty();
    listA.forEach(function(obj) {
        $('#items').append( $('<option></option>').val(obj.val).html(obj.text) )
    });
}

function loadListB(){
    $("#items").empty();
    listB.forEach(function(obj) {
        $('#items').append( $('<option></option>').val(obj.val).html(obj.text) )
    });
}

Here is the fiddle http://jsfiddle.net/pratbhoir/TF9m5/1/

See the new Jsfiddle for Json http://jsfiddle.net/pratbhoir/TF9m5/3/

Upvotes: 2

netlyonel
netlyonel

Reputation: 155

B default, I don't think the concept of "data-source" means something in html/javascript

Nevertheless, the solution you're looking for is something like knockoutjs

You'll be able to bind a viewmodel to any html element, then you will be able to change the data source of your DropDownList

see : http://knockoutjs.com/documentation/selectedOptions-binding.html

Upvotes: 0

Arijit Mukherjee
Arijit Mukherjee

Reputation: 3875

ofcourse you can so that

try

var newOption = "<option value='"+"1"+'>Some Text</option>"; $(".lstSource").append(newOption);

or

$(".lstSource").append($("<option value='123'>Some Text</option>");

Or

$('.lstSource'). append($("<option></option>"). attr("value", "123"). text("Some Text"));

Link for reference

Upvotes: 0

Related Questions