创建MVC删除按钮扩展-如何扩展MVC;s的Html帮助程序

本文关键字:MVC 扩展 Html 帮助程序 何扩展 按钮 删除 创建 | 更新日期: 2023-09-27 18:14:10

ASP.NET MVC 2呈现用于删除记录的链接(即<a>(。

通过GET操作允许删除操作可能是有害的,所以我想通过发布POST来进行删除。

我创建了以下代码:

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

现在,我想将此代码作为扩展方法添加到Html帮助程序中:

public static MvcForm DeleteButton(this HtmlHelper helper, string name, 
    string actionName, string controllerName, string routeValues)
{
    MvcForm form = helper.BeginForm(actionName, controllerName, routeValues);
    return form;
}

这就是我陷入困境的地方。如何使此删除按钮工作?

创建MVC删除按钮扩展-如何扩展MVC;s的Html帮助程序

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

@Html.DeleteButton( "Delete", "Boodschap", new { id = item.BoodschapID } );

直接生成HTML(注意:未经测试,您可能需要适当的空检查等(

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

另一种选择是重用表单helpers和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("");
}

虽然我认为<form>元素可以做到这一点,但它不是很AJAX。

相反,为什么不使用jQuery,连接到相应<a>链接的点击事件,然后自己向服务器发出HTTPPOST呢?

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

这样做的好处是,与为要删除的每个项目插入<form>相比,您可以保持HTML更干净,而且在语义上相关,从开发、SEO和其他角度来看,干净的标记始终是一个优势。