2011-11-12 38 views
5

ASP.NET MVC 2 hiển thị liên kết (ví dụ: <a>) để xóa bản ghi.Tạo phần mở rộng nút MVC Delete - Cách mở rộng trình trợ giúp Html của MVC?

Có thể có hại cho phép xóa các hành động thông qua các tác vụ GET, vì vậy tôi muốn xóa bằng cách phát hành POST.

tôi đã tạo ra những đoạn mã sau đây:

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

Bây giờ tôi muốn thêm mã này vào các helper Html như một phương pháp khuyến nông:

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

Bây giờ đây là nơi tôi bị kẹt. Làm cách nào để có nút xóa này hoạt động?

Trả lời

4

Nếu bạn muốn tạo mã đầy đủ, bạn sẽ sai về việc trả lại mã số MvcForm. Bạn muốn có nó trả về một MvcHtmlString và xây dựng HTML trong phương thức. Bằng cách đó bạn có thể sử dụng nó như:

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

Tạo mã HTML trực tiếp (lưu ý: chưa được kiểm tra, bạn có thể cần kiểm tra rỗng thích hợp vv)

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

Một thay thế sẽ được tái sử dụng các hình thức giúp đỡ và Response.Write, nhưng có phương pháp trả về một (trống) chuỗi, có lẽ cái gì đó như:

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

Tôi đã chỉnh sửa câu trả lời cuối cùng - sau một số thay đổi - dường như hoạt động chính xác. –

+0

Thông tin chi tiết rất hay về cách thực hiện 'phản hồi.Write' trong HtmlHelper. Cảm ơn!! Ước gì tôi có thể bỏ phiếu lại. –

1

trong khi tôi nghĩ rằng một yếu tố <form> sẽ làm các trick, nó không phải là rất AJAX-y.

Thay vào đó, tại sao không sử dụng jQuery, wire up to the click event cho các liên kết <a> thích hợp và sau đó issue an HTTP POST to the server yourself?

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

Lợi thế này là bạn giữ HTML của bạn nhiều sạch hơn nếu bạn chèn một <form> cho mỗi mục mà bạn muốn xóa, và ngữ nghĩa có liên quan, đánh dấu sạch luôn là một lợi thế từ một phát triển, SEO và các quan điểm khác.

+0

Tôi thích ý tưởng sử dụng một số loại bài đăng ajax. Các đối số của các thanh HTML sạch hơn trong đầu của tôi. Tôi không biết nếu đó là mục tiêu của một ứng dụng kinh doanh. Kể từ khi tôi đọc http://www.hanselman.com/blog/JavaScriptIsAssemblyLanguageForTheWebSematicMarkupIsDeadCleanVsMachinecodedHTML.aspx, tôi đã tự hỏi là các ứng dụng kinh doanh thậm chí nên tham dự để viết html sạch. –

+0

@ KeesC.Bakker: Tôi sẽ không nói đó là mục tiêu, nhưng HTML rõ ràng hơn là mục tiêu của các thực hành phát triển tốt IMO; khi đối mặt với một bức tường HTML, nó sẽ là một cơn ác mộng để lội qua tất cả để xem nơi nào đó đã xảy ra sự cố; với jQuery (hoặc một cái gì đó tương tự), bạn có một sự tách biệt tốt hơn các mối quan tâm; ngoài ra, bạn đang sử dụng mã thử nghiệm chiến đấu. Cuối cùng, bạn sẽ có nhiều người hơn trong tự nhiên, những người có thể giúp đỡ khi bạn tất cả theo cùng một mô hình như trái ngược với cố gắng để tìm ra trường hợp thích hợp cho mình bởi vì bạn digressed. – casperOne

+0

Tôi ủng hộ việc xử lý nó qua AJAX, nhưng điều này sẽ phá vỡ nếu có lỗi javascript trên trang hoặc javascript bị tắt. Bạn có thể chặn biểu mẫu gửi với trình xử lý và thực hiện nó thông qua AJAX - hoặc thậm chí bỏ các biểu mẫu chỉ để lại các nút có trình xử lý thích hợp nếu cần. – tvanfosson

Các vấn đề liên quan