C#MVC2:如何获取下拉列表的选定值

C#MVC2:如何获取下拉列表的选定值,c#,asp.net-mvc-2,cascadingdropdown,C#,Asp.net Mvc 2,Cascadingdropdown,我正在尝试将一个开发不完善的C#web应用程序转换为MVC2,而我在尝试构建级联下拉列表时遇到了困难。代码如下: public IEnumerable<SelectListItem> SchoolList { get { DataTable dt = ClassModels.GetSchools(); List<SelectListItem> list = new List<Se

我正在尝试将一个开发不完善的C#web应用程序转换为MVC2,而我在尝试构建级联下拉列表时遇到了困难。代码如下:

public IEnumerable<SelectListItem> SchoolList
    {
        get
        {
            DataTable dt = ClassModels.GetSchools();
            List<SelectListItem> list = new List<SelectListItem>();
            foreach (DataRow row in dt.Rows)
            {
                list.Add(new SelectListItem
                {
                    Text = Convert.ToString(row["School"]),
                    Value = Convert.ToString(row["SID"]),
                });
            }
            return list;
        }
    }

    public IEnumerable<SelectListItem> DepartmentList
    {
        get
        {
            DataTable dt = DomData.GetDepartments(this is where the selected SID goes)
            List<SelectListItem> list = new List<SelectListItem>();
            foreach (DataRow row in dt.Rows)
            {
                list.Add(new SelectListItem
                {
                    Text = Convert.ToString(row["Department"]),
                    Value = Convert.ToString(row["DID"]),
                });
            }
            return list;
        }
    }

遗憾的是,我必须在没有AJAX或jQuery的情况下完成这项工作。

因为您不能使用AJAX,而只能使用纯javascript,所以您可以订阅第一个下拉列表的onchange事件,然后提交表单以填充第二个下拉列表

但在将其付诸实施之前,让我们先定义一个视图模型。在我的示例中,我将很明显地消除您的问题中存在的所有杂音(例如数据表和数据访问特定代码,并简单地对值进行硬编码,以便答案更一般,因此只需调用数据访问方法来替换这些硬编码值):

最后是一个观点:

<%@ Page 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewPage<MyViewModel>" 
%>
<% using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myform", data_departments_url = Url.Action("Departments") })) { %>
    <div>
        <%= Html.LabelFor(x => x.SchoolId) %>
        <%= Html.DropDownListFor(
            x => x.SchoolId, 
            Model.SchoolList, 
            "-- School --",
            new { id = "school" }
        ) %>
    </div>

    <div>
        <%= Html.LabelFor(x => x.DepartmentId) %>
        <%= Html.DropDownListFor(
            x => x.DepartmentId, 
            Model.Departments,
            "-- Department --"
        ) %>
    </div>
<% } %>

对于那些没有与您相同的约束条件并且可以使用AJAX和jQuery的用户,请看下面的答案:

没有AJAX和jQuery?你认为这将如何发生?你至少能使用javascript吗?如果没有javascript,您将永远无法订阅第一个ddl的
onchange
事件。因此,如果您根本无法使用javascript,那么您需要一个额外的按钮,用户需要在第一个ddl中进行选择后单击该按钮,以便将表单提交给服务器并重新绑定第二个ddl。那又怎样?这正是我的问题。。我想我可以用JS。我不能使用AJAX/jQuery的唯一原因是客户机有严格的规范。如果我使用JS,那该如何工作呢?那么纯JS(没有任何JS库)和AJAX?这是你的要求吗?你对你的客户做了什么,他们这么恨你?我认为他们以前的开发人员是个傻瓜,他们现在只是看不起程序员。好吧,我相信这会奏效的,非常感谢。。不过,我有一个问题。。关于如何枚举数据表,您有什么建议吗?请注意,我刚刚创建了一个帮助器方法来转换数据表。。你很好,迪米特洛夫,非常感谢。
public class MyViewModel
{
    public MyViewModel()
    {
        Departments = Enumerable.Empty<SelectListItem>();
    }

    public int? SchoolId { get; set; }
    public IEnumerable<SelectListItem> SchoolList
    {
        get
        {
            // TODO: fetch the schools from a DB or something
            return new[]
            {
                new SelectListItem { Value = "1", Text = "school 1" },
                new SelectListItem { Value = "2", Text = "school 2" },
            };
        }
    }

    public int? DepartmentId { get; set; }
    public IEnumerable<SelectListItem> Departments { get; set; }
}
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Departments(MyViewModel model)
    {
        // TODO: use model.SchoolId to fetch the corresponding departments
        // from your database or something
        model.Departments = new[]
        {
            new SelectListItem { Value = "1", Text = "department 1 for school id " + model.SchoolId },
            new SelectListItem { Value = "2", Text = "department 2 for school id " + model.SchoolId },
            new SelectListItem { Value = "3", Text = "department 3 for school id " + model.SchoolId },
        };
        return View("Index", model);
    }
}
<%@ Page 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewPage<MyViewModel>" 
%>
<% using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myform", data_departments_url = Url.Action("Departments") })) { %>
    <div>
        <%= Html.LabelFor(x => x.SchoolId) %>
        <%= Html.DropDownListFor(
            x => x.SchoolId, 
            Model.SchoolList, 
            "-- School --",
            new { id = "school" }
        ) %>
    </div>

    <div>
        <%= Html.LabelFor(x => x.DepartmentId) %>
        <%= Html.DropDownListFor(
            x => x.DepartmentId, 
            Model.Departments,
            "-- Department --"
        ) %>
    </div>
<% } %>
window.onload = function () {
    document.getElementById('school').onchange = function () {
        if (this.value) {
            var form = document.getElementById('myform');
            form.action = form.getAttribute('data-departments-url');
            form.submit();
        }
    };
};