我应该如何/何时初始化取决于视图中选择的模型字段?

时间:2012-08-13 19:57:52

标签: c# asp.net-mvc razor

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

1 个答案:

答案 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>