我需要根据上面下拉列表中的选定值初始化“ConditionalAnalysisInput”。我需要访问dbset
才能执行此操作。
初始化ConditionalAnalysisInput字段的最佳方法是什么?
这是视图代码:
@using (Ajax.BeginForm("_ListConditionalAnalysis",
new AjaxOptions { UpdateTargetId = "_conditionals",
InsertionMode = InsertionMode.InsertAfter}))
{
@Html.DropDownListFor(model=>model.AvailableConstructs,Model.AvailableConstructs)
<p>
<input type="submit" value="Populate" />
</p>
}
<div id="_conditionals">
@*** Need to init ConditionalAnalysisInput here depending on the selected value from the dropdown list. Access to dbset needed *@
@foreach (var item in Model.ConditionalAnalysisInput)
{
@Html.Partial("_ListConditionalAnalysis",item)
}
</div>
答案 0 :(得分:2)
您真的想要回调服务器以获取下一部分所需的新模型数据。初始化模型(以及连接到数据库)是服务器端的职责,永远不应该直接在客户端上处理。
我会创建一个动作来获取所选项目并返回您需要处理的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 / 公共ActionResult索引() { var model = new DropDownModel(new List { “选项A”, “选项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的change事件添加处理程序。在更改事件期间,您可以向服务器发出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>