سؤال

هناك الكثير من المنشورات والشروحات الجيدة جدًا حول كيفية تنفيذ التحقق من الصحة باستخدام ASP.NET MVC، وأنا أفضل واحدة منها:

ومع ذلك، أحب حقًا الاتصال بـ ActionMethods عبر طريقة jquery $.ajax.أحد أسباب رغبتي في استخدام $.ajax هو أنه سيكون هناك الكثير من طرق العرض الجزئية التي يتم تحميلها في الصفحة ديناميكيًا (حتى نموذج إنشاء الكيان) عبر استدعاءات $.ajax ولا يمكنني إرجاع العرض فحسب - سأفقد كل المحتوى الذي تم تحميله ديناميكيًا.

لإعطائك رؤية أفضل للمشكلة، سأقوم بنشر بعض التعليمات البرمجية البسيطة لشرح كيف أرغب في استدعاء إجراءات وحدات التحكم والتعامل مع الاستجابات في كود jquery العميل.

طريقة عمل وحدات التحكم:

    public ActionResult CreateCustomer(string name, string accountNumber)
    {
        try
        {
            CustomerService.InsertCustomer(name, accountNumber);

            return Json(new ActionInfo()
            {
                Success = true,
                Message = "Customer Is Successfully Created"
            });

        }
        catch (Exception ex)
        {
            return Json(new ActionInfo()
            {
                Success = false,
                Message = ex.Message
            });
        }
    }

الاتصال والتعامل في رمز العميل:

$.ajax({
type: "POST",
url: $form.attr('action'),// /MyController/CreateCustomer
data: $form.serialize(),
error: HandleUnespectedError,
dataType: "json",
success: function(response) {

    if (response.Success)
        alert("Success: " + response.Message);
    else
        alert("Error: " + response.Message);
}});

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

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

المحلول

لقد حققت نجاحًا كبيرًا في إجراء التحقق من الصحة عبر AJAX باستخدام سمات التعليقات التوضيحية للبيانات.من أجل التحقق من صحة البيانات الخاصة بك، سوف تحتاج إلى استخدام وحدة التحكم ModelState الملكية، والتي لديها خاصية خاصة بها تسمى IsValid.أقترح بشدة إلقاء نظرة خاطفة على البرنامج التعليمي لسمات التحقق من صحة البيانات التوضيحية من موقع ASP.NET MVC الرسمي.

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

// model object
public class Customer
{
  public Int32 Id {get; set;}
  public String Name {get; set;}
  public String AccountNumber {get; set;}
}

// controller
public class CustomerController : Controller
{
  public ActionResult CreateCustomer( [Bind(Exclude = "Id")] Customer customer )
  {
     // controller action code
  }
}


تأكد من تسمية حقول النموذج الخاصة بك لتتوافق مع أسماء خصائص كائن العميل حتى يتمكن ASP.NET MVC من ربطها تلقائيًا.السمة "الربط"، في هذه الحالة، تطلب من ASP.NET MVC تجاهل خاصية "المعرف" الخاصة بفئة العميل عند ربط حقول النموذج بخصائص النموذج.نظرًا لأن هذا عميل جديد، فليس لدينا معرف حتى الآن، لذلك يمكننا ترك المعرف بأمان مهما كانت القيمة الافتراضية وترك طبقة البيانات لمعرفة أفضل السبل لإنشائها.

بمجرد قيام وحدة التحكم ببناء كائن النموذج لطريقة العمل، يمكن التحقق من صلاحيته بسهولة عبر ModelState.IsValid ملكية.كما قد يتوقع المرء، فإنه سيعود صحيحًا إذا كانت خصائص النموذج صالحة، أو خطأ إذا كانت خاصية واحدة أو أكثر غير صالحة.

ومن السؤال الأصلي يتبين أن CustomerService.InsertCustomer الطريقة هي طرح الاستثناءات عند فشل التحقق من الصحة.هذا غير ضروري على الإطلاق.يجب أن يحتاج InsertCustomer فقط إلى تنفيذ أي عمليات بيانات ضرورية لإدراج السجل الجديد.ما لم تكن ترغب في تجريد استثناءات محددة للتنفيذ، مثل SqlException، لا ينبغي أن يحتاج InsertCustomer حقًا إلى التقاط أي استثناءات أو طرحها، ولكن يمكنه على الأرجح السماح لأي استثناءات بالوصول إلى وحدة التحكم (أو أيًا كان المتصل).

قد تكون النتيجة النهائية لكل هذا إجراء تحكم يشبه ما يلي:

public ActionResult CreateCustomer( [Bind(Exclude = "Id")] Customer customer )
{
  // model is invalid
  if (!ModelState.IsValid)
  {
    return Json(new ActionInfo()
    {
      Success = false,
      Message = "Validation failed" // you will probably want a more robust message :-)
    });
  }

  // service method accepts a Customer object rather than arbitrary strings  
  CustomerService.InsertCustomer(customer);

  return Json(new ActionInfo()
  {
    Success = true,
    Message = "Customer created successfully."
  });

}


إذا كنت تريد الإبلاغ عن أخطاء غير متوقعة، مثل الاستثناءات المتعلقة بقاعدة البيانات، فيمكنك بالتأكيد إضافة كتلة محاولة/التقاط حول استدعاء InsertCustomer، وإرجاع النتيجة الضرورية لعرض رسالة الخطأ مرة أخرى إلى العميل.

نصائح أخرى

لقد مر أكثر من عام على طرح سؤالك، لكنني قمت بتغطية التحقق من جانب الخادم من خلال مكالمات Ajax في مشاركة مدونة قد يكون ذلك محل اهتمام كبير بالنسبة لك.أرى أنك تقوم بإرجاع النتائج الفاشلة كمكالمات HTTP ناجحة.لقد تعاملت مع هذا بشكل مختلف (أعتقد أنه أكثر صحة منذ ذلك الحين $.ajax لديه القدرة على success و error وظيفة الاستجابة).ومثالك الخاص هو مثال مثالي يمكن تنفيذه من خلال الوظيفة التي أشرحها في منشور مدونتي.

بشكل أساسي بدلاً من إرجاع استجابة ناجحة دائمًا (ولكن مع تعيين الخصائص لإخبار العميل بفشل المعالجة من جانب الخادم) أفضل طرح استثناء على الخادم والتعامل معه وفقًا لذلك على العميل.أنا أستخدم فئة ModelStateException مخصصة مع فئة HandleModelStateException مرشح العمل.

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