【问题标题】:Can i have One form tag inside Another in ASP.net MVC RC2我可以在 ASP.net MVC RC2 的另一个里面有一个表单标签吗
【发布时间】:2010-03-06 11:04:07
【问题描述】:

我目前正在 MVC2 中开发应用程序 我想在我的应用程序中使用多个表单标签 在我看来 我创建了一个具有删除选项的表,我正在通过 Post for Individual Delete 执行此选项,因此我为每个按钮创建了表单标签。 我还希望用户提供删除多条记录的选项,因此我为它们提供了复选框。此表单应具有复选框的所有值和所有值。 所以表单会像这样渲染

对于每个删除按钮

 <form action="/Home/MutipleDelete" method="post">   
<input class="button " name="Compare" type="submit" value="Mutipledelete" style="margin-right:132px;"  />

<input id="chk1" name="chk1" type="checkbox" value="true" />

<form action="/Home/Delete" method="post"> 

    <input type="submit"  class="submitLink"  value="member1" />

     <input type="hidden" name="hfmem1" id="hfmem1" value="1"  />  

                 </form>
<input id="chk2" name="chk2" type="checkbox" value="true" />

<form action="/Home/Delete" method="post"> 

    <input type="submit"  class="submitLink"  value="member2" />

     <input type="hidden" name="hfmem2" id="hfmem2" value="2"  />  

                 </form>


           </form>

以下不工作。但是如果我编写了表单以这种方式呈现的代码

    <form action="/Home/MutipleDelete" method="post">   

<input class="button " name="Compare" type="submit" value="Mutipledelete" style="margin-right:132px;"  />
</form>
<input id="chk1" name="chk1" type="checkbox" value="true" />

<form action="/Home/Delete" method="post"> 

    <input type="submit"  class="submitLink"  value="member1" />

     <input type="hidden" name="hfmem1" id="hfmem1" value="1"  />  

                 </form>
<input id="chk2" name="chk2" type="checkbox" value="true" />

<form action="/Home/Delete" method="post"> 

    <input type="submit"  class="submitLink"  value="member2" />

     <input type="hidden" name="hfmem2" id="hfmem2" value="2"  />  

                 </form>

它在 Mozilla 中工作,但在 IE 中不工作。我在 contoller 中的 formcollection 中有调试和检查值。要做什么。?

【问题讨论】:

    标签: asp.net-mvc-2


    【解决方案1】:

    在 XHTML 中,表单中的表单是不允许的,而且它没有任何意义。

    要完成您想要做的事情,您应该在表格中使用简单的链接/按钮。例如,这些可以向您的服务器发送“删除”请求,并且在成功完成请求后,还可以使用 jQuery 从 UI 中删除条目。

    例子:

        [Authorize]
        [HttpPost]
        public JsonResult Delete(Guid id)
        {
             // do stuff, delete the item
             return Json(succeeded ? Id.ToString() : "error");
        }
    

    在视图中

    <a href="#" onclick="$.post('/Stuff/Delete/' + id, function(data) { deleteCallback(data); }); return false;">delete</a>
    
    function deleteCallback(data)
    {
      if(data=="error"){
        /* error handler for UI */
      }
      else {
        /*remove the entry from the user interface*/
      }
    };
    

    如果要进行多次删除,则不应使用 URL 传输要删除的 ID 列表(因为 IE 有 2k 限制,看起来很讨厌),而是使用以下语法:

    arrayVariable = new Array(); 
    // fill array with ids associated to checked checkboxes' entries
    $.post('/Stuff/Delete/' + id, {'IdsToDelete' : arrayVariable }, function(data) { deleteCallback(data); }); return false;">
    

    这可以自动序列化为真正的 .NET 列表,因此您只需迭代整数或 GUID 列表,或任何您的 PK 的样子!

    编辑:这仍然有点简化。出于安全原因,您应该保护自己免受 CSRF(跨站点请求伪造)的侵害。达林提供a great answer how to do that

    这会将[ValidateAntiForgeryToken] 添加到控制器的方法中,并且视图需要包含类似的内容

    var token = $('input[name=__RequestVerificationToken]').val();
    $.post("/YourUrl", { 'IdsToDelete' : arrayVar, '__RequestVerificationToken': token }, function(data) { deleteCallback(data); });
    

    【讨论】:

    • 感谢另一种方式,但是在这种情况下,我怎样才能在一个页面中实现单次删除和多次删除都使用 post。
    • 要使用多重删除,我会在那里放置复选框。您可以使用 jquery 检查复选框的状态并传输用户想要删除的 ID 列表。单个删除链接只是保持不变。我更新了帖子。
    • 好吧,你之前可以这么说,因为我的回答完全基于 AJAX...恐怕我不知道如何在没有 POST 的情况下同时使用 POST使用 AJAX,除了 jQuery hack,但我想这比使用 AJAX 更糟糕。
    【解决方案2】:

    forms is not allowed 的嵌套可能会导致浏览器之间出现未定义的行为。

    【讨论】:

      【解决方案3】:

      从概念上讲,表单中的表单并没有真正的意义。您不能使用操作链接代替内部表单上的按钮吗?您仍然可以设置它们的样式,使其看起来像按钮。

      【讨论】:

      • 但是使用 delete 和 get 方法并不是一个好主意,Stephen walther 也提到了 stephenwalther.com/blog/archive/2009/01/21/…
      • 好的,这是一个公平的观点。在这种情况下,我认为您需要做出最重要的决定(如果关闭 Javascript,则最不可能错过)功能:单独删除或选择删除。对最重要的一个表单使用一个表单,对另一个表单使用 Ajax。
      【解决方案4】:

      为什么不只使用一个表单并使用多个提交按钮?您需要仔细解释结果,但这样您就可以在没有 javascript 的情况下执行此操作,也无需使用扭曲的 html。

      您可能需要直接阅读Request.Params,但这相对容易处理。

      <form action="<%= Html.Encode(Url.Action("Delete"))%>">
      <ul>
      <li>Item 1 <input type="submit" id="<%= IDSafe(item_id) %>" name="<%= IDSafe(item_id2) %>" value="Delete" /></li>
      <li>Item 2 <input type="submit" id="<%= IDSafe(item_id2) %>" name="<%= IDSafe(item_id2) %>" value="Delete" /></li>
      </ul>
      <input type="submit" name="deleteall" value="Delete selected" />
      </form>
      

      【讨论】:

        【解决方案5】:

        我认为使用 post 是不可能的。 由于使用 post 我们可以找到点击了哪个提交按钮,但是如果我们想显示一些值来显示用户和我们要提交到数据库的其他值,我们将无法找到提交按钮的值。

        在这种情况下,我的提交按钮是动态生成的

        <input type="submit" name="submitbutton"   id="<%= Html.Encode(item.ideletevalue) %>" class="submitLink"   value=" <%= Html.Encode(item.deleteitemname)%>"/> 
        

        【讨论】:

          猜你喜欢
          • 2015-06-24
          • 1970-01-01
          • 2014-03-04
          • 1970-01-01
          • 2023-04-05
          • 2013-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多