【问题标题】:Passing a dynamically generated string from a View to a Controller将动态生成的字符串从视图传递到控制器
【发布时间】:2015-08-10 14:46:30
【问题描述】:

我正在使用复选框来动态创建其值的字符串,只有在选中复选框时才添加关联的值。这些值以逗号分隔。

这是一个代码笔,展示了我是如何做到这一点的:

http://codepen.io/cavanflynn/pen/mJoybE

HTML:

<dl class="dropdown"> 
    <dt>
        <a href="#">
            <span class="hida">▼</span>     
        </a>
    </dt>
    <dd>
        <div class="mutliSelect">
            <ul class="ul">
                <li>
                    <input type="checkbox" value="Test 1" />PO Number
                </li>
                <li>
                    <input type="checkbox" value="ReturnAuthNumber" />RA Number
                </li>
                <li>
                    <input type="checkbox" value="StatusId" />Status
                </li>
                <li>
                    <input type="checkbox" value="ManufacturerId" />Manufacturer
                </li>
            </ul>
        </div>
    </dd>
</dl>
<p class="multiSel"></p>  

Javascript:

$(".dropdown dt a").on('click', function () {
      $(".dropdown dd ul").slideToggle('fast');
  });

  $(".dropdown dd ul li a").on('click', function () {
      $(".dropdown dd ul").hide();
  });

  function getSelectedValue(id) {
       return $("#" + id).find("dt a span.value").html();
  }

  $(document).bind('click', function (e) {
      var $clicked = $(e.target);
      if (!$clicked.parents().hasClass("dropdown")) $(".dropdown dd ul").hide();
  });


  $('.mutliSelect').on('click', function () {
      $('p.multiSel').html(
           $(this).find('input[type="checkbox"]:checked')
           .map(function(idx, elem) {
               return $(elem).parent().text().trim();
           })
           .get().map(function(text) {
               return "<span>" + text + "</span>";
           }).join(', '));
  });

现在,我尝试使用 @Html.Hidden 在视图中隐藏此字符串,并使用表单将其传递给控制器​​操作。

所以我把段落的html改成:

@Html.Hidden("selectedRows",new { @class="multiSel"})

和 JS 到:

  $('.mutliSelect').on('click', function () {
      $('multiSel').html(
          $(this).find('input[type="checkbox"]:checked')
          .map(function(idx, elem) {
              return $(elem).parent().text().trim();
          }).get().map(function(text) {
              return text;
          }).join(', '));
  });

但我只是将{ class="multiSel"} 传递给字符串中的控制器。我知道我在这里遗漏了一些部分,但是调整它以将隐藏的字符串传递给控制器​​的最佳方法是什么。

表单提交:

@using (Html.BeginForm("RunQuery","Report"))
{
    <dl class="dropdown"> 
        <dt>
            <a href="#">
                <span class="hida">▼</span>     
            </a>
        </dt>
        <dd>
            <div class="mutliSelect">
                <ul class="ul">
                     <li>
                         <input type="checkbox" value="Test 1" />PO Number
                      </li>
                      <li>
                         <input type="checkbox" value="ReturnAuthNumber" />RA Number
                      </li>
                      <li>
                         <input type="checkbox" value="StatusId" />Status
                      </li>
                      <li>
                         <input type="checkbox" value="ManufacturerId" />Manufacturer
                      </li>
                  </ul>
              </div>
          </dd>
      </dl>

      @Html.Hidden("selectedRows",null,new { @class="multiSel"})
      <button type="submit" class="btn btn-primary" id="btnGo">Go</button>
}

控制器动作:

[HttpPost]
public ActionResult RunQuery(string selectedRows)
{

}

【问题讨论】:

    标签: javascript c# jquery html asp.net-mvc


    【解决方案1】:

    您将 htmlAttribute 作为输入值传递,请考虑:

    @Html.Hidden("selectedRows",null,new { @class="multiSel"})
    

    而不是

    @Html.Hidden("selectedRows",new { @class="multiSel"})
    

    你需要把你的JS代码改成:

    $('.mutliSelect').on('click', function () {
        $('#selectedRows').val(
            $(this).find('input[type="checkbox"]:checked')
                .map(function(idx, elem) {
                    return $(elem).parent().text().trim();
                })
               .get().map(function(text) {
                   return text;
               }).join(', ')
           );
       });
    

    【讨论】:

    • 好的,解决了这个问题,但是它向控制器传递了一个空字符串
    • 你想用JS填充这个隐藏输入的值吗?通过您发布的最后一个 JS 代码?
    • 是的,这就是我的目标
    • 好的,那么您的表单在哪里?您需要在提交事件上触发此代码。你能提供你的完整视图代码吗?请省略不相关的部分。
    • 好的,添加了我如何触发提交事件的评论
    猜你喜欢
    • 1970-01-01
    • 2017-02-21
    • 2019-11-27
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多