• ASP.NET Core 1 – قسمت 31
ASP.NET Core 1 – قسمت 31
1395/02/07 - 22:14:50 // MVC 5 & 6 // 1 نظر // 3860 بازدید

هدف از این بخش استفاده بیشتر از Tag Helper ها و در کنار آن ایجاد یک Edit Form میباشد . فرمی که اجازه دهد یک رکورد از لیست را انتخاب و یک یا چند فیلد را دستخوش تغییر کرده و دوباره مقادیر جدید را ذخیره نماییم.

بسمه تعالی

ASP.NET Core 1 قسمت سی و یکم

هدف از این بخش استفاده بیشتر از Tag Helper ها و در کنار آن ایجاد یک Edit Form میباشد . فرمی که اجازه دهد یک رکورد از لیست را انتخاب و یک یا چند فیلد را دستخوش تغییر کرده و دوباره مقادیر جدید را ذخیره نماییم.

در مرحله اول یک Edit Link مطابق زیر باید بوجود بیاوریم تا کاربر پس از کلیک بر روی آن بتواند رکورد جاری را در وضعیت Edit قرار دهد . از طریق Tag Helper ها این کار را انجام خواهیم داد.

دقت کنید که هنوز Edit Action Method نداریم و باید در Controller آنرا ایجاد کنیم . ضمننا من کدها را به زیر Restaurant.Name منتقل کردم تا خوانا تر شود . برای ایجاد Edit Action Method تقریبا مشابه وضعیت Create را پیگیری میکنیم. یک متد Get برای کلن صدا زدن فرم نیاز داریم و یک Post برای ارسال مقادیر و ثبت دیتای اصلاح شده .

از صنعت Copy/Paste استفاده کنید و نامها را تغییر دهید . اول به سراغ متد Get میروم. برای اینکه اطلاعات کاربر در فرم Edit نمایش داده شود ، یک ورودی Id لازم است و بدنه کدی مشابه آنچه در Details Action داشتیم . ضمنن باید نوع خروجی متد هم به IActionResult تغییر کند ، چرا که اگر رکوردی پیدا نشود از Redirect استفاده شده است . حالا متد Edit در وضعیت Get ایجاد شده ، اما دقت کرده اید که اصلن Edit View را هنوز نساخته ایم ؟. به تصویر زیر دفت کنید ، این تصویر متد Get برای Edit خواهد بود .

حالا باید Edit View را بسازیم. Create View را کپی و دوباره در همان فولدر Paste کنید و نام آنرا اصلاح کنید .

خوب پس حالا یک Edit.cshtml هم داریم، ولی به یکسری تغییرات نیاز دارد. تغییرات لازمه در شکل زیر مشهود خواهد بود .

فرم Edit بعد از اصلاح و استفاده از Tag Helperها مشابه شکل بالا است . این فرم اندکی نیاز به توضیح دارد . از Title که الان اندکی عجیب شده شروع میکنیم.

  1. @{  
  2.   
  3. ViewBag.Title = $"Edit {Model.Name}";  
  4.   
  5. }  
 
هنوز در حال استفاده از ViewBag هستیم ، ولی یک علامت $ اضافه شده و پس از آن هم از Model.Name استفاده شده است . هدف این بود که مثلن اگر در حال Edit کردن رستوران GoodRes هستیم در فرم Edit به عنوان Title عبارت Edit GoodRes نمایش داده شود و با استفاده از Model.Name این اتفاق رخ داده است . دلیل استفاده از $ هم این است که در Razor عبارت ما کامپایل شده و نام مورد نظر نمایش داده شود ، چون الان درون یک String را باید به صورت هوشمند کامپایل نماید .

تغییر بعدی حذف Html.Form بوده که به جای آن یک HTML Form قرار دادیم و با استفاده از Action Property مشخص کردیم که از Edit Action Method باید استفاده کند .نوع متد را هم Post قرار داده ایم. مرحله بعدی حذف LabelFor ها و استفاده از Html Label و اختصاص محتوای Name به آنها با استفاده از صفت asp-for میباشد .برای TextBox هم از Input استفاده شد که وضعیت آن هم مشخص است . همه با asp-for به Model Value ها متصل میشوند . برای Validation از Span استفاده کرده ام و با استفاده از asp-validation-for مشخص کردم روی کدام فیلد باید Validation قرار گیرد . خوب فقط DropDown باقی مانده که از Select استفاده کرده ام . با استفاده از asp-for به مقدار درون Model وصل شده و برای ایجاد لیست همان Helper قبلی را در asp-items قرار میدهیم.فقط باید یک عبارت @ قبل از آن قرار دهید تا به یک عبارت C# تبدیل شود.وضعیت Validation هم که مانند قبلی است و نکته خاصی ندارد.

حالا وقت ایجاد Edit Action Method در وضعیت Post است . باید روند عملیات ثبت رکورد به درستی انجام شود . مراحل اندکی طولانی است ، ولی نگران نباشید ، چون سخت نیست .

برای این متد یک ورودی Id نیاز دارم و یک Instant از ViewModel که قبلن ساختیم. بر اساس Id رکورد جاری را باید یافته و پس از کنترل Null نبودن و برقراری وضعیت Model درون If باید فیلدهای Restauran را با مقادیر input پر کرده و سپس صفحه را Redirect کنیم . سوال اینجاست که این عبارت Commit از کجا آمده است . درون اینترفیس IRestauranData یک متد به نام Commit ساختم و در عوض SaveChanges را حتی از متد Add هم پاک کردم . حالا بدنه Commit به شکل زیر خواهد بود.

با وجود Commit هر جا تشخیص بدهم وضعیت رکور یا رکوردهایی عوض شده یا اصلن یک رکورد افزوده شده ، Commit را اجرا میکنم تا SaveChanges انجام شود . برای همین است که متد Create در Controller هم باید این Commit را داشته باشد . به شکل زیر دقت کنید .

درون InMemoryRestaurantData هم متد Commit را به سادگی شکل زیر پیاده خواهم کرد .

خوب Edit هم به درستی انجام شد . سورس پروژه را میتوانید دانلود کنید و دقیق همه چیز را بررسی کنید . سوال خاصی اگر پیش آمد میتوانید در Telegram یا در قسمت Contact سایت یا پیامهای هر مطلب بپرسید ، چون این بخش یک کم تغییرات زیاد داشت و شاید اندکی مبهم به نظر بیاید .

در بخش بعدی به بررسی Partial View ها و پس از آن سراغ یکی از مهمترین بخشهای اضافه شده در MVC Core که در نسخ قبلی موجود نبود خواهیم رفت.

 
علی کلاهدوزان
معرفی نویسنده : علی کلاهدوزان

سلام بر دوستان ،
شاید رایج است به عنوان پروفایل کاربر ، چند خطی راجع به خودم بنویسم ، ولی وضعیت کاری و سوابق من با یک جستجوی ساده در گوگل مشخص خواهد شد ، لذا سرتان را با مطالب بی مورد به درد نیاورم بهتر است . اگر نکته خاصی لازم بود بدانید در قسمت "ایلیا سافت در یک نگاه" به احتمال زیاد یافت خواهد شد . جزئیات بیشتر را سوال کنید ، آدرس ایمیل Ali@Kolahdoozan.com همیشه جوابگوی شماست .امیدوارم از مطالب سایت استفاده کرده باشید . شاد و پیروز باشید .

امتیاز به مطلب
           
نظرات کاربران
  • ناشناس
    1395/02/08 - 19:15:51

    3
    0
    سلام ایا برای وبرایش و ایجاد لازم هست دو ویو جداگانه ساخته بشه؟
     
    -----------------
    پاسخ : این کار شدنی است ، ولی نیاز به سیاست گذاری دارد . یا باید یک Flag در سطح Model تایین کنید و از طریق آن متوجه شوید که در وضعیت Edit هستید یا باید با داشتن فقط یک Method و ورودی ID مثلا ، با هر بار صدا زده شدن متد ، ID را چک کنید و اگر Null بود وضعیت را وضعیت Create فرض کنید . در ضمن درون Action Method هم باید شرط گزاریهای لازمه را انجام دهید . جدا کردن اینها آنقدر سخت یا دردسر ساز نیست که اگر هر دو عملیات را یکی کنید ، خیلی بهینه سازی شده باشد . باز هم شاید در سناریوی شما جالب باشد.
     
    موفق باشید  
ارسال نظر