آی تی نرد

اشتراک اطلاعات و تجربیات در زمینه ی توسعه ی دات نت و البته شیرپوینت

تاریخ و زمان شمسی در MVC بدون نیاز به استفاده از تمپلیت

shamsi datetime

حل مشکل تاریخ و زمان شمسی در اکثر پروژه های نرم افزاری که کار میکنیم یک کار مازاد به شمار میاد که باید در گوشه ای از ذهنمون در نظر داشته باشیم و معمولا هم در انتهای پروژه نسبت به رفع اون اقدام میکنیم. البته هر کسی روشی داره و بالاخره این مشکل رو حل میکنه. خود من یادم هست که حدود 8 الی 9 سال پیش قسمت های سال و ماه و روز تاریخ شمسی رو به صورت عددی کنار هم میچسبوندم و توی جدول نگهداری میکردم که البته کار اشتباهی بود.

بهترین روش این هست که هر مقداری معادل کاربردش در سیستم و با نوع متناسب نگهداری بشه و مقادیر در زمان و لایه ی نمایش تغییر کنند. به هر حال مثلا وقتی میگیم تاریخ تولد، نوعش هم باید تاریخ باشه.

توی پروژه های MVC معمولا برای حل این مسئله یک تمپلیت برای نمایش و یکی هم برای ویرایش(که در نهایت مقدار به سرور ارسال میشود) استفاده می کنیم که در تمپلیت نمایش(DisplayTemplate) تاریخ رو تبدیل میکنیم و بعد نشون میدیم و در ویرایش(EditorTemplate) هم به همین صورت اما فقط مقدار میلادی رو توی یک فیلد مخفی نگهداری میکنیم و بعد در زمان Submit اون مقدار رو ارسال میکنیم. خود این کارها واقعا وقت گیر، حوصله بر، دست و پاگیر و اضافی هست، البته در نهایت برای انتخاب تاریخ مجبوریم از یک DatePicker در EditorTemplate استفاده کنیم ولی همانطور که در ادامه میخونید دیگر نگرانی تبدیل اون از شمسی به میلادی رو در سمت کلاینت رو نخواهیم داشت.

به نظر من بهترین کار این هست که تمامی این تبدیل ها رو به قسمتی از سیستم بدیم و بزاریم خودش تشخیص بده و مدیریت کنه و ما هم این مشغله رو از ذهنمون دور بندازیم.

توی یکی از مطالبم مقدمه ای در مورد کالچر در Asp.net Web form و سیستم Blogengine نوشتم که از همون استراتژی هم میشه توی MVC استفاده کرد به هر حال هر دو زیرساخت Asp.net رو دارند اما فقط نحوه ی پیاده سازی برخی ساختارهای زیرین در دو تکنولوژی متفاوت هست.

بیشتر...

ایجاد آبجکت های شیرپوینتی با استفاده از Xml Definition - لیست

برای ایجاد برخی آبجکت های شیرپوینتی از قبیل لیست، فیلد، نوع محتوا، سایت و غیره به چهار روش میشه عمل کرد:

  1.  از طریق کدنویسی یا همان آبجت مدل شیرپوینت.
  2. از طریق پاورشل.
  3. از طریق اینترفیس شیرپوینت.
  4. از طریق Definition ها.

توی این مطلب به ایجاد یک لیست سفارشی شیرپوینتی از طریق روش شماره 4 یعنی تعاریف(Definition) خواهم پرداخت.

به زبان ساده تعاریف در شیرپوینت فایل های Xml یا xsd ی هستند که حاوی مشخصات یک یا چند المنت یا آبجکت می باشند و در شاخه ی 12 یا 14 یا 15 شیرپوینت قرار میگیرند. و شیرپوینت با استفاده از این مشخصات اقدام به ایجاد آنها در دیتابیسش می کند.

خیلی مواقع شده که در تولید یک راهکار شیرپوینتی نیاز به ذخیره سازی اطلاعات در یک لیست، یا نه لزوما ذخیره سازی حتی استفاده از لیست به عنوان اینترفیس راهکار، پیدا کرده باشید. در این شرایط معمولا یک فیچر در سطح وب یا سایت در راهکار اضافه میشه و توی Event Receiver اون کدهای مربوط به ایجاد لیست نوشته میشه، که ما میتونیم به جای نوشتن کد از این تعاریف استفاده کنیم.

خب مسلما استفاده از این تعاریف مزیت های خودش رو نسبت به کد داره که از این مزیت ها میشه به موارد زیر اشاره کرد:

  • سرعت در پیاده سازی: به راحتی و با ویزارد خود VS(البته فعلا فقط لیست) میشه آبجکت مورد نظر رو ایجاد کرد.
  • ریسورس یا چند زبانه کردن: از طریق کد هم امکان این کار هست اما همیشه پاسخگو نیست و برخی مواقع درست عمل نمی کنه، اما از این طریق خیلی سریع این امکان فراهم هست و بعد از دیپلوی هم به خوبی آبجکت مورد نظر چند زبانه خواهد بود.
  • امکان دستکاری پس از دیپلوی: با توجه به اینکه تعاریف مورد نظر به صورت فیزیکی توی پوشه ی 14 موجود هست میشه تغییرات و اصلاحات لازمه رو توی فایلش داد.

میشه با استفاده از یک پروژه ی سطح فارمی تعاریف مورد نظر رو در یک پکیج(wsp) قرار داد و از طریق یک فیچر سطح سایت یا وب برروی سایت مورد نظر دیپلوی و استفاده کرد. در ادامه در یک سلوشن تستی یک لیست به همراه چند فیلد تعریف می کنیم.

ابتدا یک پروژه ی شیرپوینتی در سطح فارم ایجاد کنید(منظور اینکه سندباکس نباشه). بعد روی پروژه راست کلیک کنید و یک آیتم از نوع لیست به نام TestList اضافه کنید.

بیشتر...

بیش از 1000 متد کاربردی - C# Extension Methods Library

امروز توی صفحه ی اول کدپلکس مشغول بررسی برنامه ها و کتابخانه ها بودم که با یک کتابخانه ی کد #c بسیار عالی مواجه شدم. این کتابخانه ی کد شامل بیش از 1000 متد Extension کاربردی هست که سرعت کد نویسی رو وقعا زیاد میکنه.

بعضی وقتها نوشتن یک متد ساده که یک خط کد داره میتونه خیلی جاها به برنامه نویس کمک کنه و اگر برنامه نویس حرفه ای باشید واقعا دوست ندارید کدهای تکراری و ساده بنویسید. برای مثال متد اکستنژن زیر رو ببینید(البته این مربوط به این کتابخانه نیست ولی شاید همچین متدی داشته باشه متد زیر رو من به مسئول این کتابخانه پیشنهاد دادم و ایشان هم خوششان آمد و قرار شد به کتابخانه اضافه بشه البته تحت عنوان ToStringSafe):

      public static string ToStringForce(this object obj)
      {
         return obj == null ? "" : obj.ToString();
      }

خب همین متد ساده که وظیفه ی اون کاملا مشخص هست خیلی جاها از جمله زمان نوشتن کد Lambda خیلی کاربردی میتونه باشه. حالا تصور کنید بیش از 1000 تا از این متدها داشته باشید واقعا یک جعبه ابزار مفید برای یک برنامه نویس #c محسوب میشه.

برخی از متدها رو میتونید در تصاویر زیر ببینید:

Object extension:

Database extension:

 String extension:

میتونید برای مشاهده ی لیست کامل متدها و دانلود آن به آدرس های زیر در کدپلکس مراجعه کنید:

http://zextensionmethods.codeplex.com/
http://zextensionmethods.codeplex.com/releases/view/117295

نکات برنامه نویسی Timer Job ها در شیرپوینت

در شیرپوینت برخی از کارهای اساسی و سنگین که نیاز به اجرا شدن دوره ای و یا به دلیل طولانی بودن فرایند و پردازش می بایست باعث متوقف شدن محیط اصلی شیرپوینت نشوند از طریق سرویس ویندوزی به نام SharePoint Timer به صورت زمانبندی شده اجرا و پردازش می شوند.

شیرپوینت با فراهم کردن آبجکت مدلی شرایط ایجاد و کار با این سرویس را مهیا نموده است. به این صورت که میتوان از طریق این آبجکت مدل نمونه های جدید زمانبندی شده ای از این سرویس را ایجاد کرد که به اصطلاح فنی به ان Job گفته میشود.

جاب ها در سطح Web Application تعریف و ایجاد میشوند و مدیریت آنها تنها از طریق سنترال ادمین و با دسترسی مدیر فارم امکان پذیر می باشد. برای ایجاد و مدیریت نمونه ی جدید جاب از طریق آبجکت مدل مهیا شده می بایست شرایط زیر حتما فراهم شده باشد:

  • اجرای این کدها در سروری که شیرپوینت در ان نصب می باشد.
  • کدها یا آبجکت مدل مورد نظر می بایست ابتدا حتما در GAC قرار داشته باشند.
  • ایجاد نمونه ی جدید جاب با دسترسی کاربر مدیر فارمی که بتواند در حالت نرمال و از طریق سنترال ادمین جاب ها را مدیریت کند.
  • یکی بودن Application Pool محیطی که در ان قرار هست جاب اجرا یا ایجاد شود با سنترال ادمین. برای مثال App Pool سایت کالکشن ایکس با سنترال ادمین یکی باشد.(که البته این کار از نظر توپولوژی و استاندارد های شیرپوینت مشکل دارد.)

البته باید اعتراف کرد که فراهم کردن این شرایط مقداری مشکل و باعث کاهش میزان استفاده از این جاب ها می شود.

معمولا در راهکارهایی که در سطح فارم نوشته میشوند و برای رفع نیاز اجرای دوره ای فرایندی که می بایست در پیش زمینه ی شیرپوینت اچرا شود استفاده میشود.

تمام این راهکارها که می بایست از طریق مدیر فارم نصب و دیپلوی بشند می بایست Feature یا ویژگی انها نیز در سطوح مختلف سایت و یا مجموعه سایت فعال یا غیر فعال شوند که در این حالت در صورتی که از این جاب ها استفاده شده باشد به احتمال قریب به یقین با توجه به شرایطی که قبلا گفته شد با مشکل دسترسی مواجه خواهد شد.

بیشتر...

خطای 400 و XML Parsing Error: no element found در شیرپوینت

توی سنترال ادمین شیرپوینت 2010 مشغول ایجاد یک Web Application جدید بودم که در حین این کار با خطای زیر مواجه شدم:

HTTP 400 - Bad Request (Request Header too long)

اولین کاری که کردم همین خطا رو توی نت سرچ کردم که متوجه شدم معمولا این خطا زمانی در شیرپوینت اتفاق میوفته که کاربری که با اون لاگین کردید جزء گروههای زیادی در اکتیو دایرکتوری هست که می بایست یا تعداد این گروه ها کمتر بشه یا طول پیشفرض Request در رجیستری ویندوز بیشتر بشه.

خب در صورتی که بخواید طول Request رو زیاد کنید میتونید کد زیر رو در یک فایل با پسوند reg ذخیره و اجرا کنید:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters] 
"MaxFieldLength"=dword:0000fffe 
"MaxRequestBytes"=dword:0007a120

من هم همین کار رو انجام دادم اما متاسفانه با خطای جدید زیر مواجه شدم: 

XML Parsing Error: no element found
Location: http://.../_layouts/error.aspx?ErrorText=Failed...
Line Number 1, Column 1:

و اونقدر طول این خطا زیاد بود که به خطای قبلی حق دادم که بگه طول Request زیاد هست. مقداری جستجو کردم اما به راه حل دقیقی نرسیدم به همین دلیل لاگ خطاهای شیرپوینت رو بررسی کردم و احتمال دادم که خطای زیر باعث به وجود اومدن این مشکل هست:

Failed to call GetTypes on assembly Microsoft.Office.InfoPath.Server, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c. Could not load file or assembly 'Microsoft.Office.InfoPath, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' or one of its dependencies....

خب همین خطا رو با کیورد شیرپوینت سرچ کردم و متوجه شدم مشکل همین جاست و زمانی که شیرپوینت 2010 نصب هست، نصب آفیس 2013 و به خصوص اینفوپس 2013 کار درستی نیست و این مشکل رو به وجود میاره به همین دلیل اسمبلی های این برنامه رو از پوشه ی C:\Windows\assembly\GAC_MSIL پاک و دوباره سعی کردم یک وب اپلیکیشن ایجاد کنم و خوشبختانه این بار بدون هیچ مشکلی عملیات انجام شد.

برای رفع این مشکل میباست اسمبلی های زیر رو در حالی که دسترسی ادمین دارید از پوشه ی اشاره شده پاک کنید و یا خود برنامه ی اینفوپس 2013 رو حذف کنید در هر حال با حذف این اسمبلی ها اینفوپس هم از کار خواهد افتاد:

Policy.14.0.Microsoft.Office.InfoPath
Policy.14.0.Microsoft.Office.InfoPath.Client.Internal.Host
Policy.14.0.Microsoft.Office.InfoPath.FormControl

در انتها هم IIS رو با دستور زیر در CMD ریست کنید:

iisreset /noforce

امیدوارم که در صورتی که با این مشکل مواجه شدید این راه کار بهتون کمک و در وقتتون صرفه جویی کنه.