【问题标题】:Fetching and Adding Checkbox dynamically on selection of Dropdown boxes在选择下拉框时动态获取和添加复选框
【发布时间】:2017-07-26 11:27:26
【问题描述】:

我有一个如上的表格。我试图在用户选择表名和权限时工作,它会返回服务器端,获取所选表的列并将所有列名显示为复选框。当用户选择Save btn时,HttpPost会执行,当用户选择Cancel时,返回首页。

我为此创建了一个 ViewModel:

 // Actual EF Model
    public partial class TablePermission
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public int PermissionLevelId { get; set; }
    public string TableName { get; set; }
    public string RestrictViewFields { get; set; }
    public string RestrictEditFields { get; set; }

    public virtual PermissionLevel PermissionLevel { get; set; }
    public virtual User User { get; set; }
}
// View Model for the View
public class TablePermissionsVM
{

    public TablePermissionsVM()
    {
        TablePermission = new TablePermission();
        RestrictViewFields = new List<FieldList>();

        // Created for trial to see Checkboxes 
        RestrictViewFields.Add(new FieldList() { FieldName = "UserId", Selected = false });
        RestrictViewFields.Add(new FieldList() { FieldName = "fName", Selected = false });
        RestrictViewFields.Add(new FieldList() { FieldName = "lName", Selected = false });

        RestrictEditFields = new List<FieldList>();
    }

    public TablePermission TablePermission { get; set; }

    public List<FieldList> RestrictViewFields { get; set; }

    public IEnumerable<FieldList> RestrictEditFields { get; set; }
}

// Model to save field names & it's selected status
public class FieldList
{
    public string FieldName { get; set;  }
    public bool Selected { get; set; }
}
}

控制器更新:添加了必须调用 onChange 事件的新操作(FillFields())方法

       [Authorize]
    [HttpGet]
    public ActionResult TablePermissions(TablePermissionsVM tablePermissionVm)
    {
        return View(tablePermissionVm);
    }

    // Action Method to Fill Column names for the List<>.
    public ActionResult FillFields(string tableName, string tblPermLevel)
    {
        // WANT TO RETURN HERE ANOTHER LIST (2 LIST OBJECTS) IN JSON
        // restrictView & restrictEdit 
        var restrictView = DbUtilities.GetColumnNames(tableName);
        var restrictEdit = DbUtilities.GetColumnNames(tableName);
        return Json(restrictView, JsonRequestBehavior.AllowGet);
    }

查看 - 更新的代码:添加了 TableName 和 TableLevelPermission 的绑定字段,我在选择的表发生更改时使用的脚本。 更新 - 添加了表单 ID、脚本方法

       @model DataStudio.Models.TablePermissionsVM

using (Html.BeginForm("TablePermissions", "Admin", FormMethod.Post, new { id = "tblPermForm" }) ))
{
    @Html.AntiForgeryToken()

        <div class="form-group">
            @Html.LabelFor(model => model.TablePermission.TableName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="editor-field">
                @Html.DropDownListFor(model => model.TablePermission.TableName, 
                    DbUtilities.GetTableNames(), "Select Table", 
                    new { @class = "form-control", @onchange="FillFields()" })
                @Html.ValidationMessageFor(model => model.TablePermission.TableName, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.TablePermission.PermissionLevelId, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="editor-field">
                @Html.DropDownListFor(model => model.TablePermission.PermissionLevelId, DbUtilities.GetPermissionLevelList(), "Select Permission Level", new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.TablePermission.PermissionLevelId, "", new { @class = "text-danger" })
            </div>
        </div>

       <div class="form-group">
            @Html.LabelFor(model => model.RestrictViewFields, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="editor-field">
                 **// NEED TO ADD CHECK BOXES HER RECEIVED THRU SCRIPT** 
            </div>
        </div>
  }

<script>
    function FillFields() {
        var tblName = $('#TablePermission_TableName').val();
        var tblPermLevel = $('#TablePermission_PermissionLevelId').val();

        //($('tblPermForm').valid()) { ERROR - OBJECT DOESN'T HAVE valid()'
        if (tblName != null && tblPermLevel != null) {
            $.ajax({
                url: '/Admin/FillFields',
                type: 'GET',
                dataType: "JSON",
                data: { TableName: tblName, TablePermLevel: tblPermLevel },
                success: function (restrictView) {
                    $("#RestrictViewFields").html("");  // Clear before appending new ones
                    $.each(restrictView, function (i, field) {
                        $("#RestrictViewFields").append(
                            $('<option></option>').val(field.FieldName).html(field.FieldName))  
                  // WANT TO ADD AS 3 CHECKBOX IN A ROW
                    });

                }
            });
        }
    }
  </script>

它们是我无法弄清楚并对此感到困惑的几件事。主要是,在确保两个下拉框都有值时,我需要再次执行“获取”并获取所选表的列名并将列显示为复选框。 我实现复选框的方式,我将在 HttpPost 中获得正确的选定值,对!我是不是哪里错了?

当两个下拉菜单都被选中时如何发出获取请求??

非常感谢任何帮助。提前非常感谢。

更新我开始尝试只选择 TableName(我想要两个下拉菜单),但该事件没有发生并转到脚本中的 FillFields()。我哪里错了?我从 here 尝试了这个逻辑。不明白为什么它没有被解雇??? 顺便说一句,这是一个完整的形式,我的意思是,它们不是部分形式。我想在选择表名和权限复选框和保存 btn 时填写这 2 个 RestrictXFields 中的复选框控件,将所有内容发送到请求并保存到数据库。

更新:非常感谢,Stephen 和 Chethan。在您的支持下,我确定了事件未触发的原因。事件被触发,我能够从 db 中检索列名,成功的 HTML 部分没有被更新。斯蒂芬,我还按照您的指示添加了表单 ID 并尝试了 form.valid(),但我收到错误脚本无法识别有效()。 Model 中的两个字段在 MetaData 类中都标记为必需。目前,测试 var != null 都有效。但是,我喜欢你的 valid() 选项。

【问题讨论】:

  • 为什么只发布&lt;select&gt; 的值来进行另一次往返?您可以使用 ajax 调用服务器方法,该方法根据选择返回您的复选框并更新 DOM
  • 验证您的脚本是否实际呈现在页面上?并在浏览器中检查 TableName 下拉标记。
  • 你没有id="TableName"的元素(如果你想要&lt;select&gt;的值,那就是$('#TablePermission_TableName').val()
  • 检查您的代码生成的 html 以查看 id 属性:)
  • 您只需要首先检查两者都不是null 例如if (tblName &amp;&amp; yourOtherVariable){ make ajax call }; 但最好用 [Required] 属性装饰您的属性,以便您可以首先检查表单是否有效 - 例如if ($('form').valid() { make ajax call } 以便显示验证错误

标签: asp.net-mvc razor checkbox dynamic http-get


【解决方案1】:

根据我的理解,您应该使用 ajax 调用来获取复选框。

在您的控制器中创建一个操作方法,该方法接受 TableName 和 TableLevelPermisson 下拉列表的选定值。使用这些值来获取

List<FieldList> RestrictViewFields  
IEnumerable<FieldList> RestrictEditFields. 

并用作局部视图的数据/模型。

在更改下拉列表值时使用 ajax 调用此操作方法。 获取从局部视图返回的 HTML 并在您的 DOM 中使用它。

当两个下拉菜单都被选中时如何发出获取请求??

如果您使用的是 jQuery:只需在 google 上搜索“jquery 中的下拉更改事件”和 ajax 调用示例。

【讨论】:

  • TableName 和 TableLevelPermission 的下拉值已经分别与 model.TablePermission.TableName 和 model.TablePermission.TableLevelPermission 相关联。我已经更新了我的问题并添加了一些我尝试过使用 ajax 调用的代码,但它不起作用。你能看看它并帮助我知道我哪里出错了!谢谢
  • 你能告诉我这行正在生成什么 HTML:@Html.DropDownListFor(model => model.TablePermission.TableName, DbUtilities.GetTableNames(), "Select Table", new { @class= "表单控制”,@onchange="FillFields()" }) ?? (在浏览器中检查元素):应该显示如下内容:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多