我想要做的是使用我的数据库进行简单的级联DDL。 假设我有一个对象类:
public class ObjectModel
{
public int id { get; set; }
public string type { get; set; }
public string name { get; set; }
}
类型是“工厂”,“样本”和“样本结果”。 用户选择工厂的那一刻 - 例如 - 显示所有工厂的名称。 我的Task类有ObjectID成员和ObjectType成员。 因此,当ObjectID获取第一个选项时,我想将第二个选项传递给ObjectType成员。 这是我使用的脚本:
<script type="text/javascript">
$(function () {
$.getJSON("/Home/Object/List", function (data) {
var items = "<option>---------------------</option>";
$.each(data, function (i, object) {
items += "<option value='" + object.Value + "'>" + object.Text + "</option>";
});
$("#Objects").html(items);
});
$("#Objects").change(function () {
$.getJSON("/Home/ObjectType/List/" + $("#Objects > option:selected").attr("value"), function (data) {
var items = "<option>---------------------</option>";
$.each(data, function (i, objectType) {
items += "<option value='" + objectType.Value + "'>" + objectType.Text + "</option>";
});
$("#ObjectType").html(items);
});
});
});
</script>
我的观点是:
@Html.LabelFor(model => model.ObjectID)
<select id="Objects" name="Objects"></select>
<br />
@Html.LabelFor(model => model.ObjectName)
<select id="ObjectType" name="ObjectType"></select>
我的控制器是:
public ActionResult Create() { return View(); }
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Task task) {
if (ModelState.IsValid) {
db.Tasks.Add(task);
db.SaveChanges();
return RedirectToAction("Index"); }
return View(task);
}
所以一切正常,每次我放下第一个列表我得到所有类型,然后第二个DDL显示相关的名称。 唯一的问题是我不知道如何将这些值传递给我的模型类(Task类)。 我习惯使用@ Html.dropdownlist,但这次我猜不通,因为我正在使用脚本。
答案 0 :(得分:0)
好的,让我们先获取这些下拉列表的值
var obj = $('#Objects').val();
var objType = $('#ObjectType').val();
让我们说你的控制器动作是TaskAction,我们将这些值作为get参数传递
$.get("/Home/Controller/TaskAction", { object : obj, ObjectType : objType}, function (data) {
//Do something after
});
并假设你的Task类是这样的
public class Task
{
public string Object { get; set;}
public string ObjectType { get; set;}
}
然后你可以像这样建模绑定它
public ActionResult TaskAction(Task myTask)
{
}
或者像这样明确地传递它
public ActionResult TaskAction(string object, string objType)
{
new Task{ Object = object, ObjectType = objType}
}
希望这有帮助
答案 1 :(得分:0)
只要表单元素的name
属性与模型上 public 属性的名称匹配,ModelBinder就会很高兴。请注意,案例很重要,并且拼写必须完全相同。因此,如果您的媒体资源是颜色,那么name="Colors"
将无法正确绑定,因为资本C和额外资源都是。
因此,如果您希望使用现有HTML直接绑定到Task
,Task
必须如下所示:
public class Task() {
public Task() { }
//need a default constructor with no parameters for model binding to work
public string Objects { get; set; }
//property name "Objects" matches value of input/select/textarea's name attribute
public string ObjectType { get; set; }
//other methods / properties as needed...
}