2010-03-06 40 views
5

我目前正在开发中MVC2 申请我已经想用在我的应用 多发的形式标记在我看来 我创建了具有删除选项表我正在通过邮政进行个人删除,所以我已为每个按钮创建表单标签。 我也希望用户给出选项删除多条记录,所以我给他们提供了复选框。这个表单应该具有复选框和所有的值。 这样的形式得到呈现像这样我可以有另一种内一种形式标记在ASP.net MVC RC2

对于每一个删除按钮

<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.I已经调试并检查值的FormCollection在contoller.What做的工作?

回答

2

从概念上讲,表单内的表单实际上并不合理。你不能使用动作链接代替内部表单上的按钮吗?你仍然可以让它们看起来像按钮。

+0

但使用与get方法删除不是一个好主意也是由斯蒂芬·瓦尔特http://stephenwalther.com/blog/archive/2009/01提/ 21/asp.net-mvc-tip-46-ndash-donrsquot-use-delete-links-because.aspx – coolguy97 2010-03-06 11:26:12

+1

好的,这是一个公平点。在这种情况下,我认为你需要做出最重要的决定(如果Javascript被关闭,最不可能错过)功能:单独删除或选择删除。最重要的一个使用表单,另一个使用Ajax。 – pdr 2010-03-06 12:06:06

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*/ 
    } 
}; 

如果你想要做多删除,你不应该传递的ID列表(删除使用URL,因为有一个在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); }); 
+0

感谢其他出路,但我怎么能实现单一删除和多个删除在这种情况下使用后,一个页面。 – coolguy97 2010-03-06 11:29:37

+0

要使用多重删除,我会把复选框放在那里。您可以使用jquery检查复选框的状态并传输用户想要删除的ID列表。然后,单一删除链接保持不变。 我更新了一下这篇文章。 – mnemosyn 2010-03-06 11:40:22

+0

感谢您的回复,但我不想在那里使用ajax – coolguy97 2010-03-06 12:06:24

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> 
0

我认为这将不可能使用后。 自从使用post之后,我们可以发现哪个提交按钮被点击了,但如果我们想显示一些值来显示我们想要提交给数据库的用户和其他值,将无法找到提交按钮的值。

在这种情况下,我的提交按钮

是动态生成

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