【问题标题】:ASP.NET MVC 5 - Send contents of div to Controller methodASP.NET MVC 5 - 将 div 的内容发送到 Controller 方法
【发布时间】:2017-03-27 08:37:45
【问题描述】:

我有这个带有 div 的 HTML 代码,我想将其内容传递给控制器​​。 div 基本上包含label-primary 类(link)的一些跨度项。我希望能够在控制器的这个 div 中获取标签的名称。我的想法是,一旦单击提交按钮,就获取 label-container div 内的项目列表,并将它们的名称作为 List<string> OwnerTerminals 值传递给控制器​​。我该怎么做?

HTML + JS 代码:

@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    ...
    <div id="register-terminal-panel" class="panel panel-default" style="max-width: 450px;">
        <div class="panel-heading" style="color:#003F8B">
            Add terminals to client
        </div>
        <div class="panel-body">
            <div id="label-container"></div>
            <div class="input-group input-group pull-right">
                <span class="input-group-addon">
                    <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
                </span>
                <input id="register-terminals-search" type="text" class="form-control" placeholder="Search terminals" aria-describedby="search-addon" onkeyup="searchTerminals()">
            </div>
        </div>
        <ul id="register-terminal-list-container" class="list-group">
            @foreach (Point p in terminals)
            {
                <li id="list-item-@p.Name"><a href="javascript:void(0)" class="list-group-item" onclick="createLabel('@p.Name')">@p.Name</a></li>
            }
        </ul>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" class="btn btn-default" value="Register" />
        </div>
    </div>
}

<script>
    function closeLabel(item) {
        item.parentElement.remove();
        var listItem = '\n<li id="list-item-' + item.parentElement.id + '"><a href="javascript:void(0)" class="list-group-item" onclick="createLabel(\'' +
            item.parentElement.id + '\')">' + item.parentElement.id + '</a>';
        $('#register-terminal-list-container').append(listItem);
        sortUnorderedList("register-terminal-list-container");
    };

    function createLabel(name) {
        var label =
            '<span id="' + name + '" class="label label-primary terminal-label"><span class="glyphicon glyphicon-remove" onclick="closeLabel(this)" id="terminal-label-close-btn"></span> ' + name + '</span>\n'
        $('#label-container').append(label);
        $('#list-item-' + name).remove();
    };
</script>

型号:

public class RegisterViewModel
{
    ...
    public List<string> OwnerTerminals { get; set; }
}

【问题讨论】:

  • 当您创建标签时,为什么不将名称存储在所需元素的data-name 中。不确定我是否看错了,但是给多个元素提供相同的 id terminal-label-close-btn 是无效的,但是您可以给它们一个带有该值的 data-id,然后将其用作选择器以将 data-name 值放入您的数组中然后可以发帖
  • @Fran 不确定我是否理解。我该怎么做? terminal-label-close-btn 不是标签的 id,它是标签内的“X”按钮的 id(用于从列表中删除标签)。
  • 别管那个按钮了,然后抱歉:) 虽然在多个元素上相同的id 仍然很糟糕。要不自动提交,您可以使您的按钮 type="button" 绑定到它的点击事件,在该点击事件中构建您的数组并使用手动 form.post 使用 jquery ajax 发布,如此处所示 http://stackoverflow.com/questions/425095/submit-form-using-ajax-and-jquery 将您的数组作为数据到控制器动作。
  • @Fran 所以没有办法以剃刀的方式做到这一点?
  • 您可以为每个包含该值的标签创建一个隐藏字段,以便在提交时发布隐藏字段。然而,在我看来,这样会增加不必要的 DOM 混乱。建议的 Ajax 路由非常常见。大多数时候,我什至不关心那些只读案例的表单,只需添加一个带有目标 url 的 div 并仅使用 ajax 发布,但这当然取决于您对表单其余部分的确切用例。

标签: javascript html asp.net razor


【解决方案1】:

使用帖子修改关于评论的回答

不使用ajax也是可以的,主要是通过一个隐藏的输入正确的名字来实现。

所以在创建标签的时候添加一个隐藏输入来实现它

function createLabel(name) {
    var label =
        '<span id="' + name + '" class="label label-primary terminal-label"><span class="glyphicon glyphicon-remove" onclick="closeLabel(this)" id="terminal-label-close-btn"></span> ' + name + '</span>\n'
    label = label + '<input type="hidden" value="' + name + '" name="OwnerTerminals" />';
    $('#label-container').append(label);
    $('#list-item-' + name).remove();
};

如果模型是对象,则输入名称可能需要一些对象名称前缀 - 即ModelName.OwnerTerminals

有关模型绑定的更多信息,请参考其他文章,例如: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

原答案

有两个部分

  1. 得到所有的名字 您可以通过 javascript 获取名称,例如(我制作了一个 jsfiddle,它假设您的视图在这里看起来像 https://jsfiddle.net/alantsai/p076235t/):

    $(function() {
        $("#btnGetName").click(function() {
            var nameList = [];
            $("#label-container > span").each(function() {
            nameList.push($(this).text());
            });
            alert(nameList);
        })
    })
    
  2. 将其发布到控制器
    您可能需要根据您的视图模型修改 post 对象,但如果只是 OwnerTerminals,那么应该是这样的:

    $.post("postUrl", {OwnerTerminals : nameList});
    

【讨论】:

  • 那么用剃须刀就没有办法了吗?
  • 可以使用 razor 执行此操作 - 通过使用隐藏输入进行模型绑定,我已编辑答案以包含它
  • 谢谢,我想知道如何使用@Html.HiddenFor()。我的项目是public List&lt;string&gt; OwnerTerminals { get; set; }。你知道这样做的方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2015-06-28
相关资源
最近更新 更多