2012-06-05 31 views
6

Chúng tôi đã thực hiện một chức năng cho thấy một modalpopupmessage động từ C# đến javascript, nó hoạt động tốt nhưng chúng tôi muốn thêm tham số để chúng ta có thể chuyển một hàm đại biểu (hoặc xử lý sự kiện) sẽ được gọi nếu người dùng nhấn nút OK. Bất kỳ đề xuất?ASP.NET C# Khắc phục sự kiện OK của một ConfirmMessagebox tùy chỉnh bên trong thư viện hàm

Postdata: Chúng tôi không muốn giải pháp "xác nhận bạn muốn nhấn nút này" điển hình nhưng một chức năng yêu cầu xác nhận trong bất kỳ phần nào của quy trình nếu cần. Ví dụ: Người dùng nhấp vào nút xóa mục, trong codebehind bạn kiểm tra mục có một số phụ thuộc để hiển thị một thông báo xác nhận với chức năng mensaje ... Điện thoại

Chức năng trong thư viện:

public static void Mensaje(string mensaje, EventHandler EventoClickLLamar, bool botoncancelar, string cssclass, Color colorfondo) 
{ 
    string colorfondox = ColorTranslator.ToHtml(colorfondo); 

    string idbotonok = EventoClickLLamar == null ? "" : EventoClickLLamar.Method.Name.Replace("_Click", ""); 
    string script = 
     " function verifyStyle(selector) {" + " \r\n" + 
     " var rules;" + " \r\n" + 
     " var haveRule = false;" + " \r\n" + 
     "     " + " \r\n" + 
     " if (typeof document.styleSheets != \"undefined\") { //is this supported" + " \r\n" + 
     "  var cssSheets = document.styleSheets;" + " \r\n" + 
     "  " + " \r\n" + 
     "  outerloop:" + " \r\n" + 
     "  for (var i = 0; i < cssSheets.length; i++) {" + " \r\n" + 
     "   " + " \r\n" + 
     "   //using IE or FireFox/Standards Compliant" + " \r\n" + 
     "   rules = (typeof cssSheets[i].cssRules != \"undefined\") ? cssSheets[i].cssRules : cssSheets[i].rules;" + 
     " \r\n" + 
     "   " + " \r\n" + 
     "   for (var j = 0; j < rules.length; j++) {" + " \r\n" + 
     "    if (rules[j].selectorText == selector) {" + " \r\n" + 
     "      haveRule = true;" + " \r\n" + 
     "      break outerloop;" + " \r\n" + 
     "    }" + " \r\n" + 
     "   }//innerloop" + " \r\n" + 
     "   " + " \r\n" + 
     "  }//outer loop" + " \r\n" + 
     " }//endif" + " \r\n" + 
     " " + " \r\n" + 
     "  return haveRule;" + " \r\n" + 
     " }//eof" + " \r\n" + 

     " function setFading(o, b, e, d, f) {" + " \r\n" + 
     " var t = setInterval" + " \r\n" + 
     "   (" + " \r\n" + 
     "   function() {" + " \r\n" + 
     "    b = stepFX(b, e, 2);" + " \r\n" + 
     "    setOpacity(o, b/100);" + " \r\n" + 
     "    if (b == e) {" + " \r\n" + 
     "     if (t) { clearInterval(t); t = null; }" + " \r\n" + 
     "     if (typeof f == 'function') { f(); }" + " \r\n" + 
     "    }" + " \r\n" + 
     "   }" + " \r\n" + 
     "   , d/50);" + " \r\n" + 
     " }" + " \r\n" + 
     " function setOpacity(e, o) {" + " \r\n" + 
     " // for IE" + " \r\n" + 
     " e.style.filter = 'alpha(opacity=' + o * 100 + ')';" + " \r\n" + 
     " // for others" + " \r\n" + 
     " e.style.opacity = o;" + " \r\n" + 
     " }" + " \r\n" + 
     " function stepFX(b, e, s) {" + " \r\n" + 
     " return b > e ? b - s > e ? b - s : e : b < e ? b + s < e ? b + s : e : b;" + " \r\n" + 
     " }" + " \r\n" + 

     " // we may consider adding frames support" + " \r\n" + 
     " var w = window;" + " \r\n" + 
     " // shortcut to document" + " \r\n" + 
     " var d = w.document;" + " \r\n" + 
     " // canvas, window width and window height" + " \r\n" + 
     " var r = d.documentElement;" + " \r\n" + 
     " var ww = w.innerWidth ? w.innerWidth + w.pageXOffset : r.clientWidth + r.scrollLeft;" + " \r\n" + 
     " var wh = w.innerHeight ? w.innerHeight + w.pageYOffset : r.clientHeight + r.scrollTop;" + " \r\n" + 
     " // create a block element" + " \r\n" + 
     " var b = d.createElement('div');" + " \r\n" + 
     " b.id = 'Message';" + " \r\n" + 
     " b.className = '" + cssclass + "' || '';" + " \r\n" + 
     " b.style.cssText = 'top:-9999px;left:-9999px;position:absolute;white-space:nowrap;z-index: 1001;';" + 
     " \r\n" + 
     " // classname not passed, set defaults" + " \r\n" + 
     " if (!verifyStyle(\"." + cssclass + "\")) {" + " \r\n" + 
     " b.style.margin = '0px 0px';" + " \r\n" + 
     " b.style.padding = '8px 8px';" + " \r\n" + 
     " b.style.border = '1px solid #A4BED0';" + " \r\n" + 
     " b.style.backgroundColor = '#E0ECF1';" + " \r\n" + 
     " }" + " \r\n" + 
     " var bx = d.createElement('div');" + " \r\n" + 
     " bx.style.cssText = 'position: absolute;left:0px;top:0px;width:100%;height:100%;text-align:center;z-index: 1000;background-color: " + //va seguido sin salto 
     colorfondox + ";opacity:0.5;filter:alpha(opacity=50);'" + " \r\n" + 
     " d.body.insertBefore(bx, d.body.firstChild);" + " \r\n" + 
     " d.body.insertBefore(b, d.body.firstChild); " + " \r\n" + 
     " // write HTML fragment to it " + " \r\n" + 
     " b.innerHTML = '<table><tr><td>" + mensaje + "</td></tr><tr><td align=\"center\">" + 

     (string.IsNullOrEmpty(idbotonok) 
     ? "<input type=\"submit\" value=\"Aceptar\" onClick=\"disabled=true;setFading(b, 100, 0, 1000, function() { d.body.removeChild(bx); d.body.removeChild(b); });\" >" 
     : "<input type=\"submit\" value=\"Aceptar\" onClick=\"__doPostBack(\\'" + idbotonok + "\\',\\'\\')\" id=\"" + idbotonok + "\" >") + 

     (botoncancelar 
     ? "<input type=\"submit\" value=\"Cancelar\" onClick=\"disabled=true;setFading(b, 100, 0, 1000, function() { d.body.removeChild(bx); d.body.removeChild(b); });\" >" 
     : "") + 

     "</td></tr></table>';" + " \r\n" + 
     " // save width/height before hiding " + " \r\n" + 
     " var bw = b.offsetWidth;" + " \r\n" + 
     " var bh = b.offsetHeight;" + " \r\n" + 
     " // hide, move and then show" + " \r\n" + 
     " b.style.display = 'none';" + " \r\n" + 
     " b.style.top = (wh/2 - bh/2) + 'px'; //center" + " \r\n" + 
     " b.style.left = (ww/2 - bw/2) + 'px'; //center" + " \r\n" + 
     " b.style.display = 'block';" + " \r\n"; 

    ScriptManager.RegisterClientScriptBlock((Page)HttpContext.Current.Handler, typeof(Page), "mensaje", script, true); 
} 

trang Kiểm tra:

public partial class Test: Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 

    btnDeleteItem_Click(object sender, EventArgs e) 
    { 
     //DB checks 
     .... 
     .... 
     //After x checks against Database we see the item has some dependency so we ask for confirmation 
     FunctionsLibrary.Mensaje("This Item has x dependency, are you sure you want to delete it?", btnDeleteItemConfirmed_Click, true, "cssclassx", System.Drawing.Color.Gray); 
    } 

    btnDeleteItemConfirmed_Click(object sender, EventArgs e) 
    { 
     //delete item definitively, handle dependencies etc... 
    } 
} 

Tùy chọn mà chúng tôi couldnt làm cho công việc (trong trường hợp chúng tôi đã đi đúng hướng nhưng có điều gì đó sai):

  • Trường hợp 1: (Phần được triển khai trong mã ví dụ của chúng tôi) Sử dụng EventHandler + __doPostBack vì vậy nếu bạn có buttonid_click được xác định trong trang của mình, nó sẽ được gọi là đăng lại. (Sự kiện không tăng ... chúng tôi cho rằng đó là vì chúng tôi không thêm điều khiển Ok vào tải trang ... cho chúng tôi trường hợp 2)

  • Trường hợp 2: Lưu chức năng ủy nhiệm được chuyển, đăng ký trang sự kiện .load + = GetPostBackControlID(), trong trang sau tải GetPostBackControlID() được gọi, có chúng tôi kiểm tra nếu id kiểm soát nhấp là nút OK của chúng tôi, nếu có thì gọi hàm đại biểu

+0

Tôi muốn xem xét chuyển sang Silverlight và mương mà tường khủng khiếp khủng khiếp của inline JS – Alex

+0

@alex chúng tôi thích sử dụng javascript hoặc ajax từ hàm chứa hơn là sử dụng runtimes – VSP

Trả lời

3

vì vậy, bạn muốn nói chuyện với codebehind từ hộp thoại Javascript? Giải pháp tốt nhất là sử dụng Ajax. Hãy xem cách thực hiện tại đây: http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/

Hãy nhớ rằng bạn sẽ gọi phương thức tĩnh trong codebehind của mình để không phải tất cả dữ liệu trong trang sẽ khả dụng. Tuy nhiên, bạn có thể truy cập đối tượng Session thông qua đối tượng HttpCurrent.

Chúc may mắn.

+0

Cảm ơn, vâng, chúng tôi muốn trỏ đến một hàm cụ thể sẽ được gọi trong trường hợp người dùng nhấp vào nút ok (Chức năng này sẽ được chuyển thành tham số hàm Message() xuất hiện: Message ("Do something?", DoSomethingFunctionPointer); Các vấn đề với giải pháp này: -Phương thức được truyền phải được gọi là tĩnh và webmethod (nhớ hàm thư bên trong thư viện sẽ được sử dụng bởi người khác) -Các trang ScriptManager phải có thuộc tính EnablePageMethods là đúng hoặc chương trình phải bao gồm các tham chiếu jquery để sử dụng hàm này – VSP

0

sau khi kiểm tra dependecy thiết lập btnDeleteItem.OnClick như btnDeleteItem.OnClick +=btnDeleteItemConfirmed_Click và thiết lập btnDeleteItem.OnClientClick OnClientClick="return confirm('Are you sure you want to delete this item?');"

Tháng này Giúp Bạn