سؤال

مشروعي يستخدم Castle Monorail كإطار MVC. المشكلة هي أن Monorail يتطلب أن يكون لدى جميع وحدات التحكم قالب عرض. أحاول استعادة سلسلة من طريقة على وحدة تحكم عبر مكالمة Ajax. يحصل Ajax دائمًا على إرجاع خطأ 500 من الخادم لأن Monorail لا يمكنه العثور على قالب عرض. لقد رأيت أمثلة أخرى من الحلول التي تقوم فيها فقط بتعيين نوع الإرجاع لطريقة وحدة التحكم إلى الفراغ (هذه الإشارات monorail حتى لا تهتم بإيجاد وحدة تحكم عرض) ثم القيام بشيء مثل:

Context.Response.OutputStream.Write(buffer, 0, buffer.Length);

لكتابة السياق على الشاشة فقط.

لذلك لدي طريقة متابعة وأحاول الحصول على سلسلة الإرجاع عبر jQuery Ajax Get. هل يمكن لأحد أن يساعد؟

 public void Note(string id)
    {
        if (!string.IsNullOrEmpty(id))
        {
            if (notesProvider.HasNote(id))
            {
                return "{status:'200', text: '" + notesProvider.GetNote(id).Body + "'}";

            }
            else return "{status:'404', text: 'Could not find the Note by provided id [" + id + "]'}";
        }
        else return "{status:'500', text: 'Illegal request : a note id must be provided'}";
    }
}

كيف يمكنني جعل هذا الإرجاع باطلاً وقراءة قيم الإرجاع عبر httpcontext؟

هل كانت مفيدة؟

المحلول

يمكن لجميع وحدات تحكم Monorail المشتقة الوصول إلى طريقة تسمى "CancelView ()". قم بتنفيذ هذه الطريقة ضمن الطريقة التي ترغب في العودة إليها دون استخدام قالب عرض.

نصائح أخرى

يمكنك استخدام jsonreturnbinder لذلك:

[return:JSonReturnBinder]
public object Note(string id)
{
    if (!string.IsNullOrEmpty(id))
    {
        if (notesProvider.HasNote(id))
        {
            return new {status=200, text= notesProvider.GetNote(id).Body };
        }
        else return new {status=404, text="Could not find the Note by provided id [" + id + "]" };
    }
    else return new {status =500, text="Illegal request : a note id must be provided" };
}

اقتراح الصقل:

لماذا إرجاع رمز الحالة كجزء من هيئة الاستجابة؟ هناك حقل httpstatuscode في أي استجابة. سيؤدي تعيينه على الرمز المطلوب إلى جعل رمز العميل أسهل في استخدام رمز العميل (يمكنك فحص رمز الحالة في XMLHTTPrequest مباشرة ، ومعظم مكتبات JS لديها معالجات مخصصة للنجاح والأخطاء) ، بالإضافة إلى أن طريقتك ستعيد السلسلة المطلوبة ، لذلك اختبار الوحدة سيكون أسهل بكثير. مثال:

[return:JSonReturnBinder]
public string Note(string id)
{
    if (!string.IsNullOrEmpty(id))
    {
        if (notesProvider.HasNote(id))
        {
            return notesProvider.GetNote(id).Body;
        }
        else 
        {
            Response.StatusCode = 404;
            return "Could not find the Note by provided id [" + id + "]";
        }
    }
    else 
    {
        Response.StatusCode = 500;
        return "Illegal request : a note id must be provided";
    }
}

اقتراح آخر - خلط الكتل if/else لتقليل مستويات التعشيش:

[return:JSonReturnBinder]
public string Note(string id)
{
    if (string.IsNullOrEmpty(id))
    {
        Response.StatusCode = 500;
        return "Illegal request : a note id must be provided";
    }

    if (notesProvider.HasNote(id) == false)
    {
        Response.StatusCode = 404;
        return "Could not find the Note by provided id [" + id + "]";
    }

    return notesProvider.GetNote(id).Body;
}

وبهذه الطريقة ، يبدأ الرمز بضمان (شروط مسبقة) ، ويمثل بيان الإرجاع الأخير في الطريقة إكمال التنفيذ العادي. IMO يجعل الأمور أسهل في القراءة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top