【问题标题】:ASP.NET - Possible to create tag with onclick event on button?ASP.NET - 可以在按钮上创建带有 onclick 事件的标签吗?
【发布时间】:2021-08-14 13:16:35
【问题描述】:

我有一个带有 TextArea 的页面,可让您发送一条消息。但就我而言,我想发送几条消息。

我想有一个按钮来创建我想要的新 TextArea,但我没有找到解决方案。

@Html.TextAreaFor(m => m.MessageToSend, new { style = "width: 1200px; height: 600px;" }) 上面是我想通过单击按钮创建/复制的文本框。

-- 我已经可以发送消息了,我只想通过点击按钮创建其他TextArea

【问题讨论】:

    标签: javascript asp.net asp.net-mvc asp.net-core


    【解决方案1】:

    由于要发送多条消息,最好将MessageToSend 属性数据类型从string 更改为List<string>。像这样的代码:

    public class MessageViewModel
    {
        public string Title { get; set; }
        public List<string> MessageToSend { get; set; }
    }
    

    在查看页面中,当页面加载时,您可以复制初始的textarea 并将其用作模板。然后,您可以添加一个 Font Awesome Plus 图标来显示添加按钮。在其点击事件中,您可以根据模板动态添加textarea 元素。代码如下:

    家庭控制器:

        public IActionResult SendMessage()
        {
            MessageViewModel model = new MessageViewModel() { MessageToSend = new List<string>() { "" }, Title="" };
            return View(model);
        }
        [HttpPost]
        public IActionResult SendMessage(MessageViewModel message)
        {
            if (ModelState.IsValid)
            {
                return View(message);
            }
            return View();
        }
    

    SendMessage 查看页面:

    @model MVCWebApplication.Models.MessageViewModel
     
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    
    <div class="row">
        <div class="col-md-4">
            <form asp-action="SendMessage">
                <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                <div class="form-group">
                    <label asp-for="Title" class="control-label"></label>
                    <input asp-for="Title" class="form-control" />
                    <span asp-validation-for="Title" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="MessageToSend" class="control-label"></label> <i class="fa fa-plus" id="iconAdd" style="font-size:22px"></i>
                    <div id="multiple">
                        @if (Model.MessageToSend.Count > 0)
                        {
                            @for (var i = 0; i < Model.MessageToSend.Count; i++)
                            {
                                @Html.TextAreaFor(c=>c.MessageToSend[i], new{ style = "width: 1200px; height: 60px;"})
                            }
                        }
    
                    </div><span asp-validation-for="MessageToSend" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <input type="submit" value="Create" class="btn btn-primary" />    <input type="button" id="btnAjaxCreate" value="Ajax Create" class="btn btn-primary" />
                </div>
            </form>
        </div>
    </div>
    

    在上述页面的最后,添加以下脚本:

    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
        <script>
            $(function () {
                //get the first textarea, use it as a template.
                var existingtext = $("#multiple").html();
                //submit button click event
                $("#iconAdd").click(function () {
                    //get the count of the textarea.
                    var num = $("#multiple").find("textarea").length;
                    //change the template id and name value.
                    newtext = existingtext.replace("MessageToSend[0]", "MessageToSend[" + num + "]").replace("MessageToSend_0_", "MessageToSend_" + num + "_");
                    //dynamically add the textarea element.
                    var htmlcontent = $("#multiple").html() + newtext;
                    $("#multiple").html(htmlcontent);
                });
            });
        </script>
    }
    

    此外,您还可以使用JQuery.Ajax 将数据发送到操作方法。

    添加如下动作方法:

        [HttpPost]
        public IActionResult AjaxSendMessage(MessageViewModel message)
        {
            if (ModelState.IsValid)
            {
                return Ok("success");
            }
            return View();
        }
    

    并添加以下脚本:

                //using Ajax to send the data to the action method.
                $("#btnAjaxCreate").click(function () {
                    //create a object to store the entered data.
                    var message = {};
                    message.Title = $("#Title").val();
                    var messgecontent = [];
                    $("#multiple").find("textarea").each(function (index, item) {
                        messgecontent.push($(item).val());
                    });
                    message.MessageToSend = messgecontent;
    
                    $.ajax({
                        url: "/Home/AjaxSendMessage",
                        method: "Post",
                        data: message,
                        success: function (response) {
                            alert(response);
                        },
                        error: function (response) {
                            console.log("error");
                        }
                    })
    
                });
    

    结果如下:

    【讨论】:

    • 嘿,非常感谢,我将一些部分集成到我的代码中。但我不明白如何使用模型中的方法。例如,我想通过单击“创建”按钮来调用此方法。这是一个已经创建的发送方法
    • “但我不明白如何使用模型中的方法。”你的意思是你还想使用你的模型(MessageToSend 属性是字符串类型)?如果是这样的话,你也可以参考上面的代码来动态添加textarea元素,但是当你向action方法提交数据时,你可能只会得到第一个textarea值。因此,在我的示例中,我建议您将string 类型更改为List&lt;string&gt;。如果使用第一种方法(更改模板名称和 id 属性),我们可以通过模型绑定方法发送多条消息。
    • “例如,我想通过单击“创建”按钮来调用此方法。”在这种情况下,您可以将加号图标更改为 &lt;input type='button'&gt; 元素,然后附加按钮单击事件。
    • 我忘了通知,它正在工作。我没有使用所有东西,但您发送的大部分代码都很有用
    【解决方案2】:

    是的,你可以,首先你需要安装 jquery。然后,您需要将代码放在 div 中,例如:

     <div id="multiple">
         @Html.TextAreaFor(m => m.MessageToSend, new { style = "width: 1200px; height: 600px;" 
          })
      </div
    

    然后创建一个按钮来添加多个办公桌,例如:-

       <button class="btn btn-primary" onclick="adder()">Adder</button>
    

    最后,写脚本

      <script>
           function adder()//This function is called when u click that button
            {
               var html='';
               html += '@Html.TextAreaFor(m => m.MessageToSend, new { style = "width: 1200px; height: 600px;" })
              })';
              $("#multiple").append(html); //This will stack your html input inside that id as we have name multiple and given id
          
            }
        
          </script>
    

    但是,你需要管理你的控制器

    【讨论】:

    • 我正在添加一个金块包(Jquery)。安装好后,要不要在代码里加点东西?
    • Uncaught ReferenceError: messageAdder is not defined at HTMLInputElement.onclick 单击按钮时出现此错误
    • so,如果消息是未捕获的参考。这意味着 onclick 无法找到 adder() 函数。所以请确保您在 onclick 定义的函数名称与脚本上的相同名称匹配
    • 这很奇怪,这是同名:/
    猜你喜欢
    • 1970-01-01
    • 2016-06-29
    • 2017-08-25
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    相关资源
    最近更新 更多