您真的很想对服务器进行回调以获取下一部分所需的新模型数据。初始化模型(并连接到数据库)是服务器端的职责,不应该直接在客户端处理。
我将创建一个操作,该操作采用所选项目并返回您需要处理的 ConditionalAnalysisInput 对象列表。每当更改下拉列表时,发出 AJAX 调用以获取新数据并刷新您的 _conditionals div。
正常的免责声明认为这是非常简单的,而不是你不应该清理它就过去的东西,这里有一个简单的例子,我把它放在一起来说明我的意思:
我有两个测试模型,显然是简化的。第一个是您最初需要的网页数据(即下拉列表)。第二个模型用于您的局部视图,这取决于下拉列表中的选定项目:
public class DropDownModel
{
public IEnumerable<string> DropDownOptions
{
get;
set;
}
public DropDownModel()
{
}
public DropDownModel(IEnumerable<string> dropDownOptions)
{
DropDownOptions = dropDownOptions;
}
}
public class ConditionalsModel
{
public IEnumerable<string> ConditionalAnalysisInput
{
get;
set;
}
public ConditionalsModel()
{
}
public ConditionalsModel(string selectedOption)
{
if (selectedOption == "Option A")
{
ConditionalAnalysisInput = new List<string>
{
"Input A 1",
"Input A 2",
"Input A 3"
};
}
else if (selectedOption == "Option B")
{
ConditionalAnalysisInput = new List<string>
{
"Input B 1",
"Input B 2",
"Input B 3"
};
}
}
}
接下来是控制器。主要操作只是填充主模型并返回视图。您还需要添加第二个方法,该方法将所选项目作为参数并返回 PartialViewResult:
public class AjaxTestController : Controller { // // GET: /AjaxTest/ public ActionResult Index() { var model = new DropDownModel(new List { "Option A", "Option B" }); 返回视图(模型);}
public PartialViewResult GetDataForDiv(string selectedOption)
{
var model = new ConditionalsModel(selectedOption);
return PartialView("Conditionals", model);
}
}
创建一个“条件”部分视图,其中包含要在 _conditionals div 中显示的所有标记:
@model TestMvcProgram.Models.ConditionalsModel
<ul>
@foreach (var item in Model.ConditionalAnalysisInput)
{
<li>@item</li>
}
</ul>
在您的主视图上,为 DropDownList 的更改事件添加一个处理程序。在更改事件期间,您可以向服务器发出 get 请求以调用 GetDataForDiv 方法,然后使用生成的部分视图更新 _conditionals div。这是我的例子:
@model TestMvcProgram.Models.DropDownModel
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<div>
@Html.DropDownList("selectedOption", Model.DropDownOptions.Select(x => new SelectListItem { Selected = false, Text = x, Value = x }), new {id = "selectedOption"})
<div id="_conditionals"></div>
</div>
<script type="text/javascript" language="javascript">
$(function () {
$('#selectedOption').change(function () {
$.get('@Url.Action("GetDataForDiv", "AjaxTest")' + "?selectedOption=" + $(this).val(), function(data, textStatus, jqXHR) {
$("#_conditionals").html(data);
});
});
});
</script>
</body>
</html>