2014-07-12 28 views
1

我想制作删除链接安全的内容。即。AntiforgeryToken&许多形式perf

行1

编辑删除

行2

编辑删除

其中删除链接插入链接。

要删除链接POST请求,而不是得到的请求,我可以用一个AntiForgeryToken和AntiForgeryToken验证

using(Html.BeginForm("Delete","Home", FormMethod.Post)) 
    { 
      @Html.AntiForgeryToken()  
      @Html.Hidden("objectId", i) 
      <input type="submit" value="Delete" /> 
    } 

C#

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Delete(int objectId) 
{ 
     SafeLogic(); 
     return View(...); 
} 

配对一个简单的表格后要做到这一点

我也想用表来做这件事,但是我对这么多的令牌产生了一些性能问题,例如。

@for (int i = 0; i < 500; i++) 
{ 
    <tr> 
    <td> Data Row @i </td> 
    <td>  
    using(Html.BeginForm("Index","Home", FormMethod.Post)) 
    { 
      @Html.AntiForgeryToken()  
      @Html.Hidden("objectId", i) 

      <input type="image" src="img_delete.gif" alt="Delete" /> 
    } 
    </td> 

} 

AntiForgeryTokens的生成代价如何?是许多AntiForgery令牌的生成例如。高达100,将成为一个问题。有这么多内联html表单可以吗?

+0

我会看下面的@Josh代表什么 - 用jQuery调用页面感觉更现代。即使你发布帖子,那里的表单也会要求用户重新加载整个页面或框架。 – zaitsman

+0

我也想知道答案,当每个人都只是添加javascript来完成无需完成的工作时,它就会让我很烦恼。它只是增加了不必要的复杂性和脆弱性。 (并不是说我反对那些善于使用javascript的漂亮网站,但它只是这个默认答案,让我很紧张)。到目前为止,没有任何答案直接回答这个问题。 –

+0

太糟糕了,接受的答案不回答关于大量antiforgerytokens成本/性能的问题:( – marapet

回答

1

我有一个个人项目,需要像你这样的事情。

而不是每个项目可以删除的表单,我有一个单一的形式与一个防伪造令牌。

@using(Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    {your HTML/Razor} 
} 

的删除图标,基本上是一个Ajax调用会激活控制器动作......

public JsonResult Delete(int id) 
{ 
    //delete the item 
    if(success) 
    { 
     return Json(true, JsonRequestBehavior.DenyGet); 
    } 
    else 
    { 
     return Json(false, JsonRequestBehavior.DenyGet); 
    } 
} 

...这行动将返回true或false(成功或失败)。根据这些信息,我会使用jQuery从表格中删除项目(在我的例子中是一个格式化的表格列表)。这样我就不会刷新整个页面。

可能不适合您的实施,但为我工作。

我不一定知道哪个是最佳实践,多个表单或带有多个提交按钮的单个表单。有人说,如果这些表格的最终动作指向相同的动作,则不应该使用多种形式。更多的信息:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=html+best+practices+multiple+forms

它可能归结为你希望你的html有多漂亮或可读,例如,如果你有一个页面有几个块,它可能不会是所有的乱。不过,想想一旦你有五个或六个这样的块,你的页面将会如何。

+0

我认为使用jquery&ajax技术上是强制后操作的正确方法 - 因为它避免了页面重新刷新 - 所以我猜我将标记为答案,从某种意义上说,尽管内联表单允许我将构建转化为一个javascript框架来处理简单的动作。 – user1778606

+0

@ user1778606我曾经想过同样的事情,但最近我发现javascript增加了很多的功能,与制作静态页面相比,开销非常低;对于客户端来说,它看起来更干净,因为它都发生在后台。 – Josh

0

我在循环之外移动了令牌来避开任何正在进行的perf任务。我仍然不确定很多内联表单是一个很好的解决方案,甚至比附加脚本或onclick事件更好。只是尝试一下。

@{var token = @Html.AntiForgeryToken();} 


@for (int i = 0; i < 5; i++) 
{ 


    using(Html.BeginForm("Index","Home", FormMethod.Post)) 
    { 
      @Html.Hidden("text", "Element:" + i) 
      @token 
      <input type="Submit"/> 
    } 
}