معرفی Controller

خب ما فرض را بر این می گذاریم که جلسه اول را به خوبی پشت سر گذاشتید و به اندازه کافی تمرین داشتید.اگر مطالب جلسه پیش را کاملا یاد نگرفته اید، توصیه ما به شما این است که اول آنها را کامل کنید. هدف ما ایجاد یک پروژه ساده MVC در آخر جلسه با استفاده از تمرین های هدفمند و متد جدید می باشد. در هر تمرین یک امکان جدید به تمرین قبلی اضافه می کنیم یا تمرین قبلی را بهبود می بخشیم.

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

  • چرا MVC؟
  • مقایسه Net Web Forms و ASP.Net MVC
  • معرفی Controller و View

فهرست مطالب این جلسه:

  • ارسال داده از Controller به View
  • تمرین سوم – استفاده از ViewData
    • پرسش و پاسخ در تمرین سوم
  • تمرین چهارم – استفاده از ViewBag
    • پرسش و پاسخ در تمرین چهارم
  • مشکلات ViewData و ViewBag
  • تمرین پنجم – معرفی strongly typed Views
    • پرسش و پاسخ در تمرین پنجم
  • معرفی View Model در Net MVC
    • ViewModel به عنوان یک راه حل
  • تمرین ششم – پیاده سازی View Model
    • پرسش و پاسخ در تمرین ششم
  • تمرین هفتم – View با Collection
    • پرسش و پاسخ در تمرین هفتم
  • جمع بندی

ارسال داده ها از Controller به View:

Viewای که در تمرین دوم ایجاد کردیم، خیلی استاتیک و ثابت بود. اما در حالت واقعی، بیشتر داده های  پویا و داینامیک را نشان می دهد. در تمرین بعد، برخی داده های پویا را در View نمایش می دهیم.

View داده ها را به شکل یک Model از Controller دریافت می کند.

Model:

در  ASP.Net MVC، Model درواقع business data را ارائه می دهد.

تمرین سوم – استفاده از ViewData:

ViewData یک دیکشنری است که شامل داده هایی است که بین Controller و Viewها ارسال می شود. Controller عناصر را به این دیکشنری اضافه می کند و View از آن می خواند.

گام ا: ایجاد کلاس Model

کلاسی به شکل زیر، با نام Employee در فولدر Model ایجاد می کنیم.

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Salary { get; set; }
}

گام ۲: دسترسی به Model در Controller

مانند کد زیر، یک شی Employee در متد GetView ایجاد می کنیم.

Employee emp = new Employee();
emp.FirstName = "باران";
emp.LastName="بزرگمهر";
emp.Salary = 20000;

نکته: توجه داشته باشید که فضای نام مربوط به کلاس Employee را به پروژه اضافه نمایید.

using WebApplication1.Models;

گام ۳: ایجاد ViewData و برگرداندن View

شی Employee را مانند زیر، در ViewData ذخیره می کنیم.

ViewData["Employee"] = emp;
return View("MyView");

گام ۴: نمایش داده های Employee در View

فایل MyView.cshtml را باز می کنیم. داده های Employee را از ViewData بازیابی کرده و به صورت زیر نمایش می دهیم:

<div>
    @{
        WebApplication1.Models.Employee emp=(WebApplication1.Models.Employee)
            ViewData["Employee"];
    }

<b>اطلاعات کارمندی</b><br />
    نام کارمند : @emp.FirstName @emp.LastName <br />
    حقوق کارمند: @emp.Salary.ToString("C")
</div>

گام ۵: تست و خروجی گرفتن از برنامه

کلید F5 را فشار دهید و برنامه را تست کنید.

معرفی Controller

پرسش و پاسخ در تمرین سوم:

چه تفاوتی بین نوشتن کد Razor، براکتی “{}” و بدون براکت وجود دارد؟

در تمرین قبلی، @emp.FirstName می تواند با کد زیر جایگزین شود:

@{
	Response.Write(emp.FirstName);
}

@ بدون استفاده از {} مقدار متغیر یا عبارت را نمایش می دهد.

چرا Casting نیاز است؟

ViewData به طور ذاتی اشیا را در خود نگه می دارد. هر بار که یک مقدار جدید به آن اضافه می شود، به یک شی box می شود. بنابراین هر بار که بخواهیم مقادیر را از آن خارج کنیم، unboxing مورد نیاز است.

معنی عبارت “@emp.FirstName  @emp.LastName” چیست؟

به این معنی است که FirstName و LastName را با یک فاصله پشت سر هم نمایش می دهد.

آیا می توان این عبارت را فقط با یک @ هم نوشت؟

بله، در این حالت نحوه نگارش آن به این شکل خواهد بود: @(emp.FirstName+ “”+emp.LastName)

چرا شی Employee در Controller ایجاد شده و مقدار دهی می شود؟

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

درباره Database Logic یا Data Access Layer و Business Layer چطور؟

  • Data Access Layer یکی از لایه هایی است که در Net MVC کمتر درباره آن صحبت شده است. همیشه وجود داشته اما هرگز در تعریف MVC نیامده است.
  • Business Layer همان طور که پیشتر توضیح داده شد، بخشی از Model است.

ساختار کامل MVC:

معرفی Controller

تمرین چهارم – استفاده از ViewBag

ViewBag از ویژگی های داینامیک C# 4.0 استفاده می کند و ViewData را به حالت داینامیک درمیاورد.

گام ا: ایجاد View Bag

با همان تمرین ۳ کار را ادامه می دهیم و گام ۳ آن را با کد زیر جایگزین می کنیم.

ViewBag.Employee = emp;</pre>
گام ۲: نمایش داده های Employee در View

گام ۴ را نیز با کد زیر تغییر دهید.
<pre class="lang:default decode:true ">@{
    WebApplication1.Models.Employee emp = (WebApplication1.Models.Employee)
        ViewBag.Employee;
}
&lt;b&gt;اطلاعات کارمندی&lt;/b&gt;
&lt;br/&gt;
نام کارمند: @emp.FirstName @emp.LastName 
&lt;br/&gt;
حقوق کارمند: @emp.Salary.ToString("C")

گام ۳: تست و خروجی گرفتن از برنامه

کلید F5 را فشار داده و برنامه را تست کنید.

معرفی Controller

پرسش و پاسخ در تمرین چهارم:

آیا می توانیم ViewData را ارسال کرده و آن را به عنوان ViewBag دریافت کنیم؟

بله حالت برعکس آن نیز ممکن است. همان طور که قبلا ذکر شد، ViewBag تنها خاصیت داینامیک به ViewData می دهد.

مشکلات ViewData و ViewBag:

ViewData و ViewBag گزینه مناسبی برای ارسال مقادیر بین  Controller و View می باشند. اما در پروژه های Real time استفاده از آن ها راه حل مناسبی نیست. در ادامه معایب استفاده از ViewData و ViewBag را بحث می کنیم.

مشکلات کارایی:

مقادیر درون ViewData از نوع Object هستند. ما باید قبل از استفاده، مقادیر را به نوع صحیح خودشان تبدیل کنیم، که این یک سربار اضافی را بر کارایی تحمیل می کند.

بدون امنیت در نوع داده ها و بدون هیچ خطای زمان کامپایل

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

ارتباط مناسبی بین داده ارسال شده و داده دریافت شده وجود ندارد

در MVC، Controller و View ارتباط بسیار ضعیفی دارند. Controller کاملا از آنچه که در View اتفاق می افتد بی خبر است و View نیز از اتفاقاتی که در Controller می افتد خبری ندارد.

از طریق Controller می توان یک یا چندین مقدار ViewData/ViewBag ارسال کرد. حال زمانی که برنامه نویس یک View می نویسد، باید به خاطر بسپارد که چه چیزی از Controller ارسال می شود. اگر برنامه نویس Controller با برنامه نویس View متفاوت باشد این فرایند پیچیده تر هم خواهد شد. یک بی خبری مطلق! این مسئله باعث خطاها و مشکلات بسیار در زمان اجرا می شود و بر کارایی توسعه تأثیر می گذارد.

تمرین پنجم – معرفی Viewهای Strongly type

دلیل هر سه مشکل ذکر شده برای ViewData و ViewBag نوع داده ای می باشد. نوع داده مقادیر درون ViewData از جنس Object است.

به نحوی اگر ما بتوانیم نوع داده را همان نوعی تعیین کنیم که نیاز داریم بین Controller و View ارسال کنیم، مشکل حل خواهد شد و این جاست که View های Strongly type معرفی می شوند.

حال تمرین قبل را گسترش می دهیم. به طوری که اگر حقوق کارمند(فیلد salary) بیشتر از ۱۵۰۰۰ باشد آن را به رنگ زرد یا سبز نمایش دهد.

گام ۱: ایجاد یک View به صورت Strongly type

عبارت زیر را بالای View قرار می دهیم.

@model WebApplication1.Models.Employee

عبارت بالا، View ما را به صورت strongly type از نوع Employee تبدیل می کند.

گام ۲: نمایش داده ها

حالا در داخل View به سادگی می توان نوشت @Model و سپس نقطه (.) و به این ترتیب می توان به همه propertyهای کلاس Model یعنی Employee دسترسی داشت.

معرفی Controller

کد زیر را برای نمایش داده ها می نویسیم:

&lt;b&gt;اطلاعات کارمندی&lt;/b&gt;
&lt;br/&gt;
نام کارمند : @Model.FirstName @Model.LastName 
&lt;br/&gt;
@if(Model.Salary&gt;15000)
{
&lt;span style="background-color:yellow"&gt;
         حقوق کارمند: @Model.Salary.ToString("C")

&lt;/span&gt;
}
else
{           
&lt;span style="background-color:green"&gt;
       
        Employee Salary: @Model.Salary.ToString("C")
&lt;/span&gt;
}

گام ۳: ارسال داده های Model از طریق Action method مربوط به Controller

کد action method را به صورت زیر تغییر می دهیم.

Employee emp = new Employee();
emp.FirstName = "باران";
emp.LastName="بزرگمهر";
emp.Salary = 20000;           
return View("MyView",emp);

گام ۴: تست و خروجی گرفتن از برنامه

معرفی Controller

پرسش و پاسخ در تمرین پنجم:

آیا لازم است که هر بار در View نام کلاس را کامل (Namespace.ClassName) بنویسیم؟

خیر، می توانیم از عبارت using استفاده نماییم.

@using WebApplication1.Models
@model Employee

آیا همیشه باید View را به صورت Strongly type تعریف کنیم یا می توان گاهی اوقات از ViewData و ViewBag هم استفاده کرد؟

به عنوان بهترین راهکار، همیشه View را از نوع Strongly type تعریف می کنیم.

آیا می توان View را strong type ای از نوع چندین Model تعریف کرد؟

خیر، راه حل این مسئله در تمرین بعد به طور مفصل بحث می شود.

معرفی View Model در ASP.Net MVC:

در تمرین پنجم ما اصول MVC را نقض کردیم. چرا که براساس MVC، V که اشاره به View دارد باید به طور خالص UI باشد. به هیچ وجه نباید حاوی منطق باشد. ما سه کار زیر را انجام دادیم که قوانین معماری MVC را نقض می کند.

  • First Name و Last Name را گسترش داده و به صورت Full Name نمایش دادیم. (منطق)
  • Salary را با واحد پول نمایش دادیم. (منطق)
  • Salary را برحسب مقدار آن با رنگ متفاوتی نمایش دادیم. به عبارت ساده تر، ظاهر عناصر HTML را براساس بعضی مقادیر تغییر دادیم. (منطق)

علاوه بر این سه مسئله، بحث مهم تری نیز وجود دارد. فرض کنید می خواهیم داده های مختلفی با انواع متفاوتی را در View نمایش دهیم. به عنوان مثال، نام کاربری که در حال حاضر وارد سایت شده به همراه داده های Employee نمایش دهیم.

یکی از روش های پیاده سازی به شکل زیر است:

  1. Prpperty نام کاربری را به کلاس Employee اضافه کنیم – هربار که می خواهیم داده های جدیدی در View نمایش دهیم، یک Property جدید به کلاس اضافه کنیم که منطقی به نظر نمی رسد. این property جدید ممکن است به Employee مربوط باشد یا نباشد. همچنین این کار قانون SRP از اصول SOLID را نقض می کند.
  2. استفاده از ViewBag یا ViewData – درباره مشکلات این دو در بخش قبلی بحث کردیم.

ViewModel به عنوان یک راه حل:

ViewModel یکی از لایه های MVC است که کمتر درباره آن صحبت شده است. این لایه بین Model و View قرار می گیرد و نقش یک data container (نگه دارنده داده) را برای View بازی می کند.

تفاوت بین Model و ViewModel چیست؟

Model داده های خاص Business است و براساس Business و ساختار Database ایجاد می شود. ViewModel داده های خاص View است که براساس View ساخته می شود.

چگونه کار می کند؟

بسیار ساده!

  • Controller منطق تعامل با کاربر (User Interaction logic) را مدیریت می کند یا به زبان ساده تر، درخواست های کاربر را کنترل می کند.
  • Controller داده های یک یا چند Model را دریافت می کند.
  • Controller تصمیم می گیرد که کدام View به عنوان پاسخ برای درخواست کنونی مناسب تر است.
  • Controller، شی ViewModel را ایجاد و با توجه به نیاز برنامه با استفاده از داده های Model مقداردهی می کند.
  • Controller داده های ViewModel را با استفاده از ViewData/ViewBag/Strongly typed View به View ارسال می کند.
  • Controller، View را برمی گرداند.

View و ViewModel چگونه با هم ارتباط برقرار می کنند؟

View به صورت Strong typeای از ViewModel تعریف می شود.

Model و ViewMode چگونه با هم ارتباط برقرار می کنند؟

Model و ViewModel باید از هم مستقل باشند. Controller شی ViewModel را براساس یک یا چند شی Model ایجاد و مقداردهی می کند.

تمرین ششم- پیاده سازی View Model

گام ۱: ایجاد فولدر

فولدری با نام ViewModels در پروژه ایجاد می کنیم.

گام ۲: ایجاد EmployeeViewModel

برای انجام این مرحله، باید کارهای زیر در View انجام شود:

  1. First Name و Last Name باید قبل از نمایش گسترش داده شوند.
  2. مقدار Salary باید با واحد پول نمایش داده شود.
  3. Salary باید بر اساس مقدار آن، با رنگ متفاوتی نمایش داده شود.
  4. نام کاربر جاری نیز باید در View نمایش داده شود.

یک کلاس جدید به نام EmployeeViewModel در فولدر ViewModels ایجاد می کنیم.

public class EmployeeViewModel
{
    public string EmployeeName { get; set; }
    public string Salary { get; set; }
    public string SalaryColor { get; set; }
    public string UserName{get;set;}
}

توجه داشته باشید که First Name و Last Name با یک Property به نام EmployeeName جایگزین شده اند، نوع داده Salary رشته است و دو Property به نام SalaryColor و UserName نیز اضافه شده است.

گام ۳: استفاده از ViewModel در View

در تمرین پنجم، View خود را به صورت Stongly type از کلاس Employee درآوردیم. حالا آن را به نوع EmployeeViewModel تغییر می دهیم.

@using WebApplication1.ViewModels
@model EmployeeViewModel

گام ۴: نمایش داده ها در View

محتوای داخل View را با کد زیر جایگزین کنید.

Hello @Model.UserName
&lt;hr /&gt;
&lt;div&gt;
&lt;b&gt;اطلاعات کارمندی&lt;/b&gt;&lt;br /&gt;
    نام کارمند : @Model.EmployeeName &lt;br /&gt;
&lt;span style="background-color:@Model.SalaryColor"&gt;
         حقوق کارمند: @Model.Salary
&lt;/span&gt;
&lt;/div&gt;

گام ۵: ایجاد و ارسال ViewModel

در متد GetView() داده های Model را دریافت کرده و آن را به شی ViewModel تبدیل می کنیم.

public ActionResult GetView()
{
    Employee emp = new Employee();
    emp.FirstName = "باران";
    emp.LastName="بزرگمهر";
    emp.Salary = 20000;

    EmployeeViewModel vmEmp = new EmployeeViewModel();
    vmEmp.EmployeeName = emp.FirstName + " " + emp.LastName;
    vmEmp.Salary = emp.Salary.ToString("C");
    if(emp.Salary&gt;15000)
    {
        vmEmp.SalaryColor="yellow";
    }
    else
    {
        vmEmp.SalaryColor = "green";
    }

vmEmp.UserName = "ادمین گرامی"

    return View("MyView", vmEmp);
}

گام ۵: تست و خروجی گرفتن از برنامه

کلید F5 را فشار دهید و خروجی را مشاهده نمایید.

 

معرفی Controller

همان خروجی تمرین ۵ را مشاهده می کنید اما این بار View هیچ منطقی ندارد.

پرسش و پاسخ در تمرین ششم:

آیا همه Modelها باید یک ViewModel داشته باشند؟

خیر، هر View باید ViewModel مربوط به خود را داشته باشد.

آیا داشتن رابطه ای بین Model و ViewModel راهکار خوبی است؟

خیر، به عنوان یک راهکار خوب Model و ViewModel باید از هم مستقل باشند.

آیا ما باید همیشه ViewModel ایجاد کنیم؟ حتی اگر View شامل هیچ نمایشی که نیاز به منطق داشته باشد، نباشد و بخواهد داده های Model را همان طور که هستند نمایش دهد؟

ما همیشه باید ViewModel را ایجاد کنیم. هر View همیشه باید ViewModel خود را داشته باشد حتی اگر ViewModel همان property هایی را داشته باشد که Model دارد.

فرض کنید، View ای داریم که شامل هیچ نمایشی که نیاز به منطق و برنامه نویسی داشته باشد، نیست و می خواهد داده های Model را همان طور که هستند نمایش دهد. فرض کنید که ما در اینجا ViewModel هم ایجاد نکرده ایم.

مشکل وقتی ایجاد می شود که ما در آینده بخواهیم داده های جدیدی در UI خود نمایش دهیم یا منطقی را در نمایش داده ها لحاظ کنیم. در این حالت مجبوریم که یک UI جدید را از اول دوباره بسازیم.

پس بهتر است که از اول این امکان را فراهم کنیم و ViewModel را ایجاد کنیم. در این مورد، در زمان مقداردهی ViewModel کاملا شبیه Model خواهد بود.

تمرین هفتم – View با Collection

در این تمرین می خواهیم لیستی از کارمندان (Employee) را در View نمایش دهیم.

گام ۱: تغییر کلاس EmployeeViewModel

Property نام کاربری (UserName) را از EmployeeViewModel  حذف می کنیم.

public class EmployeeViewModel
{
    public string EmployeeName { get; set; }
    public string Salary { get; set; }
    public string SalaryColor { get; set; }
}

گام ۲: ایجاد مجموعه ای (Collection) از View Model

کلاسی با نام EmployeeListViewModel درون فولدر ViewModel مانند زیر ایجاد می کنیم.

public class EmployeeListViewModel
{
    public List&lt;EmployeeViewModel&gt; Employees { get; set; }
    public string UserName { get; set; }
}

گام ۳: تغییر نوع strong type مربوط به View

MyView.cshtml را تبدیل به strong type ای از نوع EmployeeListViewModel می کنیم.

@using WebApplication1.ViewModels
@model EmployeeListViewModel

گام ۴: نمایش همه کارمندان در View

&lt;body&gt;
    @Model.UserName سلام 
    &lt;hr /&gt;
    &lt;div&gt;
        &lt;table&gt;
            &lt;tr&gt;
                &lt;th&gt;نام کارمند&lt;/th&gt;
                &lt;th&gt;حقوق کارمند&lt;/th&gt;
            &lt;/tr&gt;
            @foreach (EmployeeViewModel item in Model.Employees)
            {
                &lt;tr&gt;
                    &lt;td&gt;@item.EmployeeName&lt;/td&gt;
                    &lt;td style="background-color:@item.SalaryColor"&gt;@item.Salary&lt;/td&gt;
                &lt;/tr&gt;
            }
        &lt;/table&gt;
    &lt;/div&gt;
&lt;/body&gt;

گام ۵: ایجاد لایه Business برای Employee

در این تمرین، یک سطح دیگر گسترش می دهیم و لایه Business را به پروژه اضافه می کنیم. یک کلاس جدید با نام EmployeeBusinessLayer با یک متد به نام GetEmployee در فولدر Model ایجاد می کنیم.

public class EmployeeBusinessLayer
{
    public List&lt;Employee&gt; GetEmployees()
    {
        List&lt;Employee&gt; employees = new List&lt;Employee&gt;();
        Employee emp = new Employee();
        emp.FirstName = "باران";
        emp.LastName = "بزرگمهر";
        emp.Salary = 14000;
        employees.Add(emp);
              return employees;

گام ۶: ارسال داده ها از طریق Controller

public ActionResult GetView()
{
    EmployeeListViewModel employeeListViewModel = new EmployeeListViewModel();

    EmployeeBusinessLayer empBal = new EmployeeBusinessLayer();
    List&lt;employee&gt; employees = empBal.GetEmployees();

    List&lt;EmployeeViewModel&gt; empViewModels = new List&lt;EmployeeViewModel&gt;();

    foreach (Employee emp in employees)
    {
        EmployeeViewModel empViewModel = new EmployeeViewModel();
        empViewModel.EmployeeName = emp.FirstName + " " + emp.LastName;
        empViewModel.Salary = emp.Salary.ToString("C");
        if (emp.Salary &gt; 15000)
        {
            empViewModel.SalaryColor = "yellow";
        }
        else
        {
            empViewModel.SalaryColor = "green";
        }
        empViewModels.Add(empViewModel);
    }
    employeeListViewModel.Employees = empViewModels;
    employeeListViewModel.UserName = "Admin";
    return View("MyView", employeeListViewModel);
}

گام ۷: اجرا و تست خروجی برنامه

کلید F5 را فشار دهید و برنامه را اجرا کنید.

معرفی Controller

پرسش و پاسخ در تمرین هفتم:

آیا می توان View را به صورت strong type از List قرار دهیم؟

بله می توانیم.

چرا یک کلاس جداگانه به نام EmployeeListViewModel ایجاد کردیم، چرا View را از نوع stong type ای مانند List<EmployeeListViewModel> ایجاد نکردیم؟

به این دلیل که اگر ما به جای استفاده EmployeeListViewModel به طور مستقیم از List استفاده می کردیم، دو مشکل زیر وجود داشت:

  1. مدیریت منطق نمایش داده ها در آینده
  2. ویژگی UserName. Username با employee به تنهایی مرتبط نیست بلکه با کل View در ارتباط است.

چرا ویژگی UserName را از EmployeeViewModel حذف کردیم و آن را جزیی از EmployeeListViewModel قرار دادیم؟

برای اینکه UserName برای همه کارمندان یکسان است. نگه داشتن آن در EmployeeViewModel باعث افزایش افزونگی و همچنین افزایش حافظه موردنیاز کلی می شود.

جمع بندی:

خب تا این جا روز دوم را هم به پایان رساندیم. در روز سوم، پروژه خود را به سطح بعدی می رسانیم.

تمرین یادتون نره!

تمرینات این جلسه نیز ضمیمه شدن 🙂 تمرییین کنید 🙂

دانلود فایل PDF 

 

جزئیات فایل

زبان پروژه : C#&ASP.NET MVC
حجم فایل پیوست : 14 MB

دانلود فایل

دانلود با لینک مستقیم
پسورد فایل : www.mspsoft.com
فاطمه زکایی

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

نوشته‌های مرتبط

دیدگاه‌ها

*
*

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

    khatere پاسخ

    سلام باتشکر ازآموزش خوبتون ، بسیار جامع و پرکاربردی بود.

      باران بزرگمهر پاسخ

      خواهش میکنم موفق باشید.

    عبداللهی پاسخ

    مرسی ام اس پی سافت مرسی خانم بزرگمهر

    Saeed.N پاسخ

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

      باران بزرگمهر پاسخ

      خدمت شما هستیم.

    طالبی پاسخ

    و باز هم ممنون

    alireza پاسخ

    سلام
    وعرض خسته نباشید خدمت خانم بزرگمهر
    ممنون از بابت آموزش هاتون می خواستم ببینم شما اموزش mvc به صورت حضوری هم دارید و اگر دارید اموزشگاهتون کجاست

      مسعود شریفی پاسخ

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

    عباس پاسخ

    ادامه؟؟؟
    ظاهرا دیگه متوقف شد.

      مسعود شریفی پاسخ

      آموزش 7 روز به صورت کامل منتشر شده است !
      در سایت جستجو بفرمایید.
      موفق باشید.

    reza پاسخ

    از آموزش شما بسیار ممنونم با اینکه سالها برنامه نویسی asp.net انجام میدهم خیلی آموزش شما کامل و خلاصه و مفید بود انشااله خیر ببینید

      مسعود شریفی پاسخ

      قربانه شما موفق پیروز باشید.

    بهنام پاسخ

    خیلی ممنونم ازتون ، تشکر.

      مسعود شریفی پاسخ

      قربانه شما موفق پیروز باشید.

    mostafa پاسخ

    باسلام
    چطور میشه از view به کنترلر داده ارسال کنم؟ مثلا از یک نقشه که با جاوا اسکریپت نوشته شده در view هنگام کلیک روی نقشه به کنترلر مقدار کلیک شده رو ارسال کنم؟
    با تشکر