1

我需要根据上面下拉列表中的选定值初始化“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>
4

1 回答 1

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/ 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>
于 2012-08-13T20:03:42.887 回答