Asp.net mvc和jQuery不起作用的级联dropdownlist
我正在尝试使用一个级联dropdownlist的解决方案(一个dropdownlist中的选择决定了第二个dropdownlist中的选项),如下所示:Asp.net mvc和jQuery不起作用的级联dropdownlist,asp.net,linq,asp.net-mvc-2,drop-down-menu,Asp.net,Linq,Asp.net Mvc 2,Drop Down Menu,我正在尝试使用一个级联dropdownlist的解决方案(一个dropdownlist中的选择决定了第二个dropdownlist中的选项),如下所示: 版本信息:Microsoft.NET Framework版本:4.0.30319;ASP.NET版本:4.0.30319.1 更新: 我现在将其更新为以下内容: 获取与所选客户关联的任务的操作方法: <div> <label for="Customers"> Ku
版本信息:Microsoft.NET Framework版本:4.0.30319;ASP.NET版本:4.0.30319.1 更新: 我现在将其更新为以下内容: 获取与所选客户关联的任务的操作方法:
<div>
<label for="Customers">
Kund:</label>
<%:Html.DropDownListFor(m => m.Customers, new SelectList(Model.Customers,"Id", "Name"), new {@id="CustomerId"}) %>
<label for="Tasks">
Aktiviteter:</label>
<%:Html.DropDownListFor(m => m.Tasks, new SelectList(Model.Tasks,"Id", "Name"), new {@id="TaskId"}) %>
</div>
并且认为:
$(document).ready(function () {
//Hook onto the MakeID list's onchange event
$("#CustomerId").change(function () {
//build the request url
var url = "Timesheet/Tasks";
//fire off the request, passing it the id which is the MakeID's selected item value
$.getJSON(url, { id: $("#CustomerId").val() }, function (data) {
//Clear the Model list
$("#TaskId").empty();
//Foreach Model in the list, add a model option from the data returned
$.each(data, function (index, optionData) {
$("#TaskId").append("<option value='" + optionData.Id + "'>" + optionData.Name + "</option>");
});
});
}).change();
});
public JsonResult Tasks(string id)
{
var result = new JsonResult();
var tasks =
_model.Tasks.Where(task => task.CustomerId.ToString() == id).Select(
task => new {ID = task.Id, Name = task.Name});
result.Data = tasks;
result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
return result;
}
昆德:
m、 客户,新的选择列表(Model.Customers,“Id”,“Name”),新的{@Id=“CustomerId”})%>
Aktiviter:
m、 任务,新建选择列表(Model.Tasks,“Id”,“Name”),新建{@Id=“TaskId”})%>
现在我在第二个下拉列表中以某种方式过滤和选择了结果,在选择不同客户时,选项的数量是正确的。但是,task dropdownlist中的值对于它们都是“未定义”的
更新2:
我发现了问题:
在jQuery中,我忘记了修复任务对象的属性名称。以下是工作版本:
var tasklist = _model.Tasks.Where(x => x.CustomerId.ToString() == id)
.Select(x => new { ID = task.ID, Description = task.Description });
$(文档).ready(函数(){
public JsonResult Tasks(string id)
{
var result = new JsonResult();
var tasks =
_model.Tasks.Where(task => task.CustomerId.ToString() == id).Select(
task => new {ID = task.Id, Name = task.Name});
result.Data = tasks;
result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
return result;
}
//钩住MakeID列表的onchange事件
$(“#CustomerId”).change(函数(){
//构建请求url
var url=“时间表/任务”;
//触发请求,向其传递作为MakeID的选定项值的id
$.getJSON(url,{id:$(“#CustomerId”).val()},函数(数据){
//清除模型列表
$(“#TaskId”).empty();
//对于列表中的每个模型,从返回的数据中添加一个模型选项
$.each(数据、函数(索引、选项数据){
$(“#TaskId”).append(“+optionData.Name+”);
});
});
}).change();
});
但是我想知道如何获得DropDownList的默认值。否则,当您第一次访问页面时,customer dropdownlist将有一个值,但任务列表将不会…。JsonResult使用JavascriptSerializer生成JSON数据,JavascriptSerializer不支持循环引用。 也许下面的帖子可以帮助你解决问题: 更新 与循环引用不同,只需返回另一个对象的列表,其中只包含您需要的两个字段:ID和Description。它看起来像这样:
您确定操作方法已完成吗?
\u model.Tasks
来自哪里?使用它的代码被注释掉了-因此该行不会编译,或者您是否已取消注释掉了它?请完整地发布动作方法。不,就像我提到的,我注释掉了linq表达式,因为它不起作用。foreach做的和linq应该做的一样_Tasks是包含数据库数据的模型。我没有包括获取数据的代码。但这种行动方法是有效的。只是linq表达式不起作用(因此被注释掉)。但我仍然想知道为什么linq表达式不起作用(当然是在未注释的情况下)。但主要是,我想知道为什么jQuery似乎没有用结果任务填充第二个下拉列表…嗯,好吧。。。但我不知道该怎么处理那篇文章,它有点让我不知所措。我正在为我的模型使用实体框架,我想我不应该在那里引入任何属性([ScriptIgnore]),因为如果我更新模型,它将消失。我有一个ViewModel来简化对模型的访问。但是它只是有一组属性访问客户、任务等集合。我不知道在哪里使用此属性…谢谢,是的,我认为最好跳过循环解决方法,我尝试了你的建议。它确实改变了一些似乎在正确轨道上的东西,但我现在在任务下拉列表中得到“未定义”作为值。见上面的更新。我做错了什么?我用你建议的代码让它工作了。你能告诉我如何在第一个下拉列表中获得默认值吗?我想出来了。只需在selectlist参数后添加它:m.Customers,new-selectlist(Model.Customers,“Id”,“Name”),“请选择…”,new{@Id=“CustomerId”})%>感谢您对CGK的所有帮助!
public JsonResult Tasks(string id)
{
var result = new JsonResult();
var tasks =
_model.Tasks.Where(task => task.CustomerId.ToString() == id).Select(
task => new {ID = task.Id, Name = task.Name});
result.Data = tasks;
result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
return result;
}
var tasklist = _model.Tasks.Where(x => x.CustomerId.ToString() == id)
.Select(x => new { ID = task.ID, Description = task.Description });