Asp.net mvc ASP.NET MVC–;设置级联下拉列表的选定值
我正在开发一个ASP.NETMVC应用程序并使用NHibernate 我正在制作一个级联下拉列表,并在以下网站中使用了方法1: 一切正常,我只是想知道是否可以将级联下拉列表设置为存储在数据库中的值?例如,列表在创建页面上为空,但在编辑页面上,所选值将设置为数据库中的值 我已更新以下代码: CascadingDropDownList.jsAsp.net mvc ASP.NET MVC–;设置级联下拉列表的选定值,asp.net-mvc,cascadingdropdown,Asp.net Mvc,Cascadingdropdown,我正在开发一个ASP.NETMVC应用程序并使用NHibernate 我正在制作一个级联下拉列表,并在以下网站中使用了方法1: 一切正常,我只是想知道是否可以将级联下拉列表设置为存储在数据库中的值?例如,列表在创建页面上为空,但在编辑页面上,所选值将设置为数据库中的值 我已更新以下代码: CascadingDropDownList.js function bindDropDownList(e, targetDropDownList, selectedValue) { var key = thi
function bindDropDownList(e, targetDropDownList, selectedValue) {
var key = this.value;
var allOptions = targetDropDownList.allOptions;
var option;
var newOption;
targetDropDownList.options.length = 0;
for (var i = 0; i < allOptions.length; i++) {
option = allOptions[i];
if (option.key == key) {
newOption = new Option(option.text, option.value,selectedValue);
targetDropDownList.options.add(newOption);
}
}
函数bindDropDownList(e,targetDropDownList,selectedValue){
var key=this.value;
var allOptions=targetDropDownList.allOptions;
var期权;
var新期权;
targetDropDownList.options.length=0;
对于(var i=0;i
}
JavaScriptExtensions.cs
public static class JavaScriptExtensions
{
public static string CascadingDropDownList(this HtmlHelper helper, string name, string associatedDropDownList)
{
var sb = new StringBuilder();
// render select tag
sb.AppendFormat("<select name='{0}' id='{0}'></select>", name.Replace("'",""));
sb.AppendLine();
// render data array
sb.AppendLine("<script type='text/javascript'>");
var data = (CascadingSelectList)helper.ViewDataContainer.ViewData[name.Replace("'","")];
var listItems = data.GetListItems();
var colArray = new List<string>();
foreach (var item in listItems)
colArray.Add(String.Format("{{key:'{0}',value:'{1}',text:'{2}'},selected:'{3}'}", item.Key, item.Value,item.Text.Replace("'",""),item.Selected));
var jsArray = String.Join(",", colArray.ToArray());
sb.AppendFormat("$get('{0}').allOptions=[{1}];", name.Replace("'",""), jsArray);
sb.AppendLine();
sb.AppendFormat("$addHandler($get('{0}'), 'change', Function.createCallback(bindDropDownList, $get('{1}')));", associatedDropDownList, name.Replace("'",""));
sb.AppendLine();
sb.AppendLine("</script>");
return sb.ToString();
}
}
public class CascadingSelectList
{
private IEnumerable _items;
private string _dataKeyField;
private string _dataValueField;
private string _dataTextField;
private string _dataSelected;
public CascadingSelectList(IEnumerable items, string dataKeyField, string dataValueField, string dataTextField, string dataSelected)
{
_items = items;
_dataKeyField = dataKeyField;
_dataValueField = dataValueField;
_dataTextField = dataTextField.Replace("'","");
_dataSelected = dataSelected;
}
public List<CascadingListItem> GetListItems()
{
var listItems = new List<CascadingListItem>();
foreach (var item in _items)
{
var key = DataBinder.GetPropertyValue(item, _dataKeyField).ToString();
var value = DataBinder.GetPropertyValue(item, _dataValueField).ToString();
var text = DataBinder.GetPropertyValue(item, _dataTextField).ToString().Replace("'","");
var selected = DataBinder.GetPropertyValue(item, _dataSelected).ToString();
listItems.Add(new CascadingListItem(key, value, text.Replace("'",""),selected));
}
return listItems;
}
}
public class CascadingListItem
{
public CascadingListItem(string key, string value, string text, string selected)
{
this.Key = key;
this.Value = value;
this.Text = text.Replace("'","");
this.Selected = selected;
}
public string Key { get; set; }
public string Value { get; set; }
public string Text { get; set; }
public string Selected { get; set; }
}
公共静态类JavaScriptExtensions
{
公共静态字符串CascadingDropDownList(此HtmlHelper帮助程序、字符串名称、字符串关联DropDownList)
{
var sb=新的StringBuilder();
//渲染选择标记
sb.AppendFormat(“,name.Replace(“,”);
(某人);
//渲染数据数组
某人加上一行(“”);
var data=(CascadingSelectList)helper.ViewDataContainer.ViewData[name.Replace(“,”)];
var listItems=data.GetListItems();
var colArray=新列表();
foreach(listItems中的变量项)
colArray.Add(String.Format(“{key:{0}”,value:{1},text:{2},selected:{3}”,item.key,item.value,item.text.Replace(“,”),item.selected));
var jsArray=String.Join(“,”,colArray.ToArray());
sb.AppendFormat(“$get('{0}')。allOptions=[{1}];”,name.Replace('',“”),jsArray);
(某人);
sb.AppendFormat(“$addHandler($get('{0}'),'change',Function.createCallback(bindDropDownList,$get('{1}'));”,associatedDropDownList,name.Replace(“,”);
(某人);
某人加上一行(“”);
使某人返回字符串();
}
}
公共类CascadingSelectList
{
私人IEnumerable_项目;
私有字符串_dataKeyField;
私有字符串dataValueField;
私有字符串dataTextField;
私有字符串_dataSelected;
公共CascadingSelectList(IEnumerable项、字符串dataKeyField、字符串dataValueField、字符串dataTextField、字符串dataSelected)
{
_项目=项目;
_dataKeyField=dataKeyField;
_dataValueField=dataValueField;
_dataTextField=dataTextField.Replace(“,”);
_dataSelected=dataSelected;
}
公共列表GetListItems()
{
var listItems=新列表();
foreach(var项目在_项目中)
{
var key=DataBinder.GetPropertyValue(项,_dataKeyField).ToString();
var value=DataBinder.GetPropertyValue(项,_dataValueField).ToString();
var text=DataBinder.GetPropertyValue(项,_dataTextField).ToString().Replace(“,”);
var selected=DataBinder.GetPropertyValue(项,_dataSelected.ToString();
添加(新的CascadingListItem(键,值,text.Replace(“,”),选中));
}
返回列表项;
}
}
公营英语
{
公共CascadingListItem(字符串键、字符串值、字符串文本、选定字符串)
{
这个。键=键;
这个。值=值;
this.Text=Text.Replace(“,”);
this.Selected=Selected;
}
公共字符串密钥{get;set;}
公共字符串值{get;set;}
公共字符串文本{get;set;}
选定的公共字符串{get;set;}
}
您需要修改扩展方法,以包括一个选定值,如正常下拉列表
您还需要修改javascript:
function bindDropDownList(e, targetDropDownList) // Need to add extra parameter here.
{
var key = this.value;
var allOptions = targetDropDownList.allOptions;
var option;
var newOption;
targetDropDownList.options.length = 0;
for (var i=0; i < allOptions.length; i++)
{
option = allOptions[i];
if (option.key == key)
{
newOption = new Option(option.text, option.value); // Need to set to selected here
targetDropDownList.options.add(newOption);
}
}
谢谢我试着按照上面的答案,用代码更新了问题。这是正确的吗?我只是在学习ASP.NET MVC和JavaScript。抱歉,我认为您不需要更改这部分:sb.AppendFormat($addHandler($get({0}'),…可能尝试向选项添加一个选定选项:{{key:'{0}',value:'{1}',text:'{2}',selected:'{3}}}谢谢。我已经添加了上述代码以及添加到CascadingSelectList和CascadingListItem。我得到以下错误:数据绑定:不包含名称为的属性?请更新问题中的代码,因为我不确定您到底做了什么。
sb.AppendFormat("$addHandler($get('{0}'), 'change', Function.createCallback(bindDropDownList, $get('{1}')));", associatedDropDownList, name);