استخدام التحكم في مستخدم الويب على WebForm في مشروع MVC

StackOverflow https://stackoverflow.com/questions/2343961

سؤال

أنا أستخدم عنصر تحكم في الخادم على صفحة Web.Forms واحدة. لا بد لي من استخدام عنصر التحكم هذا على صفحة الويب. لذلك قمت بإنشاء مجلد web.forms ووضع صفحتي الجديدة فيه. ثم قمت بنسخ رمز المثال من عنصر تحكم التوقيع. أحصل على الخطأ التالية:

The base class includes the field 'ctrlSign', but its type (WebSignatureCapture.SignatureControl) is not compatible with the type of control (ASP.signaturecapture_signaturecontrol_ctlsignature_ascx).

أعرف أن الرمز يعمل لأنه إذا قمت بإزالة سمة المعرف من عنصر تحكم الخادم ، فإنه لم يعد يعطيني هذا الخطأ وتقديم تحكم الخاص بي. لكني بحاجة إلى السمة الخاصة بالمعرف حتى أتمكن من أداء الحدث بعد الحدث ... أي أفكار لماذا؟

انا استخدم هذه السيطرة على التوقيع. إليك رمز web.forms ...

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="KahunaCentralTIDRevamp.SignatureCapture.Index" %>

<%@ Reference Control="~/SignatureCapture/SignatureControl/ctlSignature.ascx" %>
<%@ Register TagPrefix="uc" TagName="Signature" Src="~/SignatureCapture/SignatureControl/ctlSignature.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
    <title>Signature Application Demo</title>
</head>
<body>

    <form id="frmOrder" method="post" runat="server">
    <div>
        Please Sign Below:
    </div>
    <div>
        <uc:Signature ID="ctrlSign" SignHeight="150" SignWidth="300" SignatureCodePath="~/SignatureCapture/SignatureControl/"
            SavePath="~/SignatureCapture/" SignatureFileFormat="Gif" runat="server" />
        <%--    <uc:Signature id="ctlMySignature" PenColor="Red" PenWidth="2" BackColor="Yellow" SignWidth="300" SignHeight="150"
                            SavePath="~/Signatures/" SignatureCodePath="~/SignatureControl/" SignatureFileFormat="Gif" Runat="server"></uc:Signature>--%>
    </div>
    <div>
        <input type="button" value="  Re-Sign " onclick="ClearSignature();">
        <asp:Button runat="server" ID="btnSave" Text=" Save " onmousedown="document.getElementById('btnSave').value = 'Wait...';"
            OnClientClick="DirectSave();" OnClick="btnSave_Click" />
    </div>
    </form>

    <script language="javascript" type="text/javascript">
        // This is the method that is directly called, this will save signature
        // and then call server code to do further processing. You can change
        // the delay of 5 seconds as per your needs
        function DirectSave() {
            SaveSignature();

            var date = new Date();
            var curDate = null;

            // delay of 5 seconds, 5000 milisecons, change as per requirement
            do { curDate = new Date(); }
            while (curDate - date < 5000);

            return true;
        }
    </script>

</body>
</html>
هل كانت مفيدة؟

المحلول

افتح ملف ترميز .ascx لعنصر تحكم المستخدم. يجب أن تقرأ شيئًا كهذا:

<%@ Control 
    Language="C#" 
    AutoEventWireup="true" 
    CodeFile="ctlSignature.ascx.cs" 
    Inherits="WebSignatureCapture.SignatureControl.ctlSignature" %>

قم بتعديله إلى:

<%@ Control 
    Language="C#" 
    AutoEventWireup="true" 
    CodeBehind="ctlSignature.ascx.cs" 
    Inherits="WebSignatureCapture.SignatureControl.ctlSignature" %>

إشعار CodeFile -> CodeBehind.

نصائح أخرى

شخص ما أعرفه يعاني من مشكلة مماثلة لفترة من الوقت ، ثم وجدوا شيئًا يمكنهم فعل شيء ما في BeginRequest الذي قام بفرز مشكلته وسمح له باستخدام عناصر التحكم في الخادم في طرق العرض. قمت بالبحث السريع عن ذلك ، وأعتقد ذلك هذه هو ما استخدمه.

الرمز أدناه:

void Application_BeginRequest(object sender, EventArgs e)
{
  var form = HttpContext.Current.Request.Form;

  form.GetType().GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(form, false, null);

  // Refinement 1:
  foreach (var key in form.AllKeys.Where(key => key.Contains("$")))
  { 
    var value = formkey;
    form.Remove(key);
    var newKey = key.Substring(key.LastIndexOf("$") + 1); 
    form.Add(newKey, value);
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top