C# 创建MVC删除按钮扩展-如何扩展MVC';什么是Html助手?

C# 创建MVC删除按钮扩展-如何扩展MVC';什么是Html助手?,c#,asp.net-mvc,asp.net-mvc-2,html-helper,C#,Asp.net Mvc,Asp.net Mvc 2,Html Helper,ASP.NET MVC 2呈现一个链接(即)以删除记录 通过GET操作允许删除操作是有害的,所以我想通过发布帖子来执行删除操作 我创建了以下代码: <% using (Html.BeginForm("Delete", "Boodschap", new { id = item.BoodschapID })) { %> <button>Delete</button> <% } %> 这就是我被卡住的地方。如何使此删除按钮工作?如果要生

ASP.NET MVC 2呈现一个链接(即
)以删除记录

通过GET操作允许删除操作是有害的,所以我想通过发布帖子来执行删除操作

我创建了以下代码:

<% using (Html.BeginForm("Delete", "Boodschap", new { id = item.BoodschapID }))
    { %>
    <button>Delete</button>
<% } %>

这就是我被卡住的地方。如何使此删除按钮工作?

如果要生成完整的代码,让它返回
MvcForm
是错误的。您希望它返回一个
MvcHtmlString
,并在方法中构造HTML。这样,您可以将其用作:

@Html.DeleteButton( "Delete", "Boodschap", new { id = item.BoodschapID } );
直接生成HTML(注意:未测试,可能需要适当的空检查等)

另一种方法是重用表单帮助程序和Response.Write,但让该方法返回一个(空)字符串,可能类似于:

public static MvcHtmlString DeleteButton(this HtmlHelper helper, string name, string actionName, object routeValues)
{
    return DeleteButton(helper, name, actionName, null, routeValues, null);
}

public static MvcHtmlString DeleteButton(this HtmlHelper helper, string name, string actionName, string controllerName, object routeValues, object htmlAttributes)
{
    using (helper.BeginForm(actionName, controllerName, routeValues, FormMethod.Post, htmlAttributes))
    {
        var response = helper.ViewContext.HttpContext.Response;
        var builder = new TagBuilder("button");
        builder.SetInnerText(name);
        response.Write(builder.ToString(TagRenderMode.Normal));
    }
    return MvcHtmlString.Create("");
}

虽然我认为
元素会起到作用,但它不是非常AJAX-y

相反,对于适当的
,为什么不使用


这样做的好处是,与为每个要删除的项目插入
相比,您可以保持HTML更加干净,而且语义相关的干净标记始终是开发的加分,SEO和其他观点。

我编辑了最后一个答案,经过一些修改后,这个答案似乎工作正常。非常好地了解了如何做
响应。在HtmlHelper中编写
。谢谢但愿我能再次投票支持它。我喜欢使用某种ajax帖子的想法。关于清洁HTML的争论一直萦绕在我的脑海中。我不知道这是否是商业应用程序的目标。自从我读到这篇文章以来,我一直在想,商业应用程序是否应该参与编写干净的html。@KeesC.Bakker:我不会说这是一个目标,但干净的html是良好开发实践的目标;当面对一堵HTML的墙时,要想彻底了解哪里出了问题将是一场噩梦;使用jQuery(或类似的东西)可以更好地分离关注点;此外,您正在使用经过战斗测试的代码。最后,当你们都遵循相同的范式,而不是试图自己找出合适的案例,因为你们离题了。我赞成通过AJAX处理它,但如果页面上出现javascript错误或javascript被关闭,这将中断。您可以使用处理程序截取表单提交,并通过AJAX进行截取,甚至可以在需要时打开表单,只留下按钮和合适的处理程序。@tvanfosson:我同意,由于页面上的javascript错误而中断是一种风险,但使用诸如、和框架之类的工具,这种可能性越来越小。此外,如果页面上有许多这样的元素,那么“HTML墙”将是一个艰难的过程。使用AJAX帖子也不是什么新鲜事…@casperOne-使用链接的问题在于,如果出现问题,您会将删除作为GET公开。在客户机上使用javascript展开表单并应用处理程序可以解决这两个问题。在为按钮构造处理程序时,可以使用表单上的操作,并且永远不会为删除公开锚定标记。另一种选择是动态添加删除功能——在相关元素上使用
data
来构建路由——并且仅当javascript工作时才使其可用。
public static MvcHtmlString DeleteButton( this HtmlHelper helper, string name, 
    string actionName, object htmlAttributes )
{
     return DeleteButton( helper, name, actionName, null, null, htmlAttributes );
}

public static MvcHtmlString DeleteButton( this HtmlHelper helper, string name, 
    string actionName, string controllerName, object routeValues, 
    object htmlAttributes )
{
     var buttonBuilder = new TagBuilder("button");
     buttonBuilder.SetInnerText( name );

     var formBuilder = new TagBuilder("form");
     var urlHelper = new UrlHelper( helper.ViewContext.RequestContext );
     formBuilder.Attributes.Add( "action", urlHelper.Action( 
         actionName, controllerName, routeValues ) )
     formBuilder.Attributes.Add( "method", FormMethod.Post );
     formBuilder.MergeAttributes( new RouteValueDictionary( htmlAttributes ) );
     formBuilder.InnerHtml = buttonBuilder.ToString();

     return new MvcHtmlString( formBuilder.ToString() );
}
public static MvcHtmlString DeleteButton(this HtmlHelper helper, string name, string actionName, object routeValues)
{
    return DeleteButton(helper, name, actionName, null, routeValues, null);
}

public static MvcHtmlString DeleteButton(this HtmlHelper helper, string name, string actionName, string controllerName, object routeValues, object htmlAttributes)
{
    using (helper.BeginForm(actionName, controllerName, routeValues, FormMethod.Post, htmlAttributes))
    {
        var response = helper.ViewContext.HttpContext.Response;
        var builder = new TagBuilder("button");
        builder.SetInnerText(name);
        response.Write(builder.ToString(TagRenderMode.Normal));
    }
    return MvcHtmlString.Create("");
}
$document.ready(function () {
    // "deleteLink is a class that identifies links that
    // are used for deleting, you might have some other mechanism
    $("a .deleteLink").click(function () { 
        $.post('post url', function(data) {
            // Do something with the data returned
        });    
    });
});