我可以在ASP.net MVC RC2中的另一个内部使用一个表单标记

时间:2010-03-06 11:04:07

标签: asp.net-mvc-2

我目前正在开发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中没有。我在formcollection中有调试和Checked值在contoller中。要做什么。?

5 个答案:

答案 0 :(得分:5)

在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); });

答案 1 :(得分:4)

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

答案 2 :(得分:2)

从概念上讲,表单中的表单并不真正有意义。您是否可以使用Action Links代替内部表单上的按钮?你仍然可以将它们设计为看起来像按钮。

答案 3 :(得分:0)

为什么不使用单个表单并使用多个提交按钮?你需要仔细解释结果,但这样你就可以在没有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>

答案 4 :(得分:0)

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

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

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