50٪ تخفیف روی تمام دوره‌ها!
پایان تخفیف تا:
مشاهده دوره‌ها
1

استفاده از Partial View با Model متفاوت از View در ASP.Net MVC

سلام به دوستان دانشمند ITPRO


من داخل View ی مطالبم که Model اون Posts هست و تمام مطالب داخل اون List میشن و یه فرم برای ارسال پست دارم .

Model های این دو با هم متفاوت هستند چرا که برای لیست مطالب من Model زیر :

@model  IEnumerable<PersonalWebsite.Domain.Entities.Post>

و برای فرم ارسال پست من Model زیر رو دارم :

@model  PersonalWebsite.Domain.Entities.Post

برای همین من مجبور به استفاده از Partial View شدم.

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

حالا سوال من اینه که آیا راهی غیر از استفاده از کلاس های ViewModel وجود داره؟ یا شاید من دارم جایی رو اشتباه می کنم!

ممنونم که یاری می کنید.

پرسیده شده در 1394/07/02 توسط

3 پاسخ

4

به مثال زیر نگاه کن

من یه کنترلر به نام Home دارم که توش دو تا اکشن دارم یکی Index و دومی MyView

 public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            var models = new List<ViewModel>();
            models.Add(new ViewModel
            {
                Name = "mehdi",
                LastName = "adeli"
            });
            models.Add(new ViewModel
            {
                Name = "ali",
                LastName = "rahimi"
            });
            return View(models);
        }

        public ActionResult MyView()
        {
            var model=new PartialModel
            {
                Id = 6,
                Username = "mAdeli"
            };
            return View(model);
        }
    }

توی کد گفته شده که مدل مربوط به Index که ویوی اصلی هستش یک لیست از ViewModelها باشه و مدل مربوط به ویوی داخلی یه شی از نوع PartialView هستش. حالا اگه بخواهیم به این شکل که گفتم از ویو ها استفاده کنیم کد ویوهای Index و MyView به شکل زیر خواهد شد.


@model List<WebApplication1.Controllers.ViewModel>

<!DOCTYPE html>

<html>
<head>
    <title>Main Page</title>
</head>
<body>
<div>
    @foreach (var item in Model)
    {
        <div>
            <h3>
                @item.Name
            </h3>
            <h5>@item.LastName</h5>
        </div>
    }

</div>
@{
    Html.RenderAction("MyView");
}

</body>
</html>

حالا کد MyView به این شکل خواهد بود:

@model WebApplication1.Controllers.PartialModel

<a href="@Model.Id">@Model.Username</a>

همونطور که توی کد میبینی من برای صدا کردن ویوی داخلی اکشن اون ویو رو صدا زدم. کلاس های ViewModel و PartialModel هم کلاس هایی هستش که خودم تعریف کردم.

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

 public ActionResult Index()
        {
            var models = new List<ViewModel>();
            models.Add(new ViewModel
            {
                Name = "mehdi",
                LastName = "adeli"
            });
            models.Add(new ViewModel
            {
                Name = "ali",
                LastName = "rahimi"
            });
            var model = new PartialModel
            {
                Id = 6,
                Username = "mAdeli"
            };
            ViewBag.ModelForPartial = model;
            return View(models);
        }

        public ActionResult MyView()
        {
            
            return View();
        }

با این شکل ما مدل ویوی داخلی را به ViewBag اضافه می کنیم. در نتیجه کد Index.cshtml ما باید به این شکل باشد.:

@model List<WebApplication1.Controllers.ViewModel>

<!DOCTYPE html>

<html>
<head>
    <title>Main Page</title>
</head>
<body>
<div>
    @foreach (var item in Model)
    {
        <div>
            <h3>
                @item.Name
            </h3>
            <h5>@item.LastName</h5>
        </div>
    }

</div>
@{
    var model = (object)ViewBag.ModelForPartial;
    Html.RenderPartial("MyView", model);
}

</body>
</html>

که در راه حل دوم از RenderPartial برای صدا زدن ویوی داخلی استفاده کردیم ولی در اولی از RenderAction و در راه دوم باید مدل را به ویوی داخلی از داخل ویوی اصلی پاس بدهیم.

پاسخ در 1394/07/03 توسط
1

سلام

شما می تونی از ViewBag مربوط به ویوی اصلی برای نگهداری مدل partialView استفاده کنی. البته این در صورتی هستش که از Html.RenderPartial برای نمایش ویوی داخلی استفاده کنی. ولی اگه بخوای این ویوی داخلی رو از داخل اکشن صدا کنی برای ویوی داخلی یک اکشن می نویسی و از Html.RenderAction در ویوی اصلی استفاده می کنی که مدل رو داخل برنامه سی شارپ به خود ویوی داخلی پاس میدی.

پاسخ در 1394/07/03 توسط
0

آقای عادلی لطف می کنین یه مقدار بیشتر توضیح بدید.

توی نت چیزی در این رابطه پیدا نکردم!

پاسخ در 1394/07/03 توسط

پاسخ شما