ورود

View Full Version : مشکل با لود اطلاعات با بودن دو Model بر روی لایوت و ویو



RIG000
شنبه 19 مهر 1393, 15:49 عصر
ببینید من یه لایوت دارم که توش از user استفاده کردم

@model CodeNevis.Models.User
حالا این لایوتو رو یه کلاس دیگه هم پیاده کردم که
میشه این

@model IEnumerable<CodeNevis.Models.Product>
حالا اینو در نظر بگیرینکه این ارور رو میده

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[CodeNevis.Models.Product]', but this dictionary requires a model item of type 'CodeNevis.Models.User'.
من وقتی لود میکنم ویو رو این میره بجا اینکه product رو پر کنه به user میره. چه جوری حلش کنم؟

parvizwpf
شنبه 19 مهر 1393, 16:25 عصر
رو یک لی اوت دو نوع مدل میدید؟

RIG000
شنبه 19 مهر 1393, 16:37 عصر
نه تو لایوت من user رو دادم و لایوت رو میارم رو یه ویو تو ویو product رو دادم.
حالا موقعی که ویو اجرا میشه از action اطلاعات product پاس میشه ولی به جا product تو ویو میره user رو تو لایوت روی ویو میخونه و بهش گیر میده .!!!! چرا؟

RIG000
شنبه 19 مهر 1393, 16:38 عصر
public ActionResult Index()
{

return View(db.Products.ToList());

}
کد داخل لایوت

@*Container all space*@
@model CodeNevis.Models.User
<div class="modal fade" id="modallogin" aria-hidden="true" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-header">

<div class=" modal-content">
<div class="modal-body">
@using (Html.BeginForm("login", "User", FormMethod.Post))
{
@Html.ValidationSummary(true)

<fieldset>
<legend>فرم ورود</legend>
<div class="editor-label">
@Html.Label("نام کاربری", new { @class = "label label-success" })
</div>
<div class="editor-field loginRegister">
@Html.TextBoxFor(model => model.PersonUserName)
@Html.ValidationMessageFor(model => model.PersonUserName)
</div>

<div class="editor-label">
@Html.Label("رمز ورود", new { @class = "label label-success" })
</div>
<div class="editor-field loginRegister">
@Html.TextBoxFor(model => model.PersonPassword, new { type = "password" })
@Html.ValidationMessageFor(model => model.PersonPassword)
</div>
<p>
<input class="btn btn-info" type="submit" value="ورود" />
</p>
<p>
@Html.ActionLink("رمز خورد را فراموش کرده ام", "Remember", "User", null, new { style = "color:red" })
</p>
</fieldset>
}

<div>
@Html.ActionLink("انصراف", "Index")
</div>
</div>
</div>
</div>
</div>

</div>
<!--////////////////////////
This bottom Code is for About Me!
-->
حالا خود ویو

@model IEnumerable<CodeNevis.Models.Product>

@{
ViewBag.Title = "Index";
Layout = "~/Views/_Sheard/_Layout/_LayoutMain.cshtml";
}

parvizwpf
شنبه 19 مهر 1393, 16:42 عصر
اینو بدونید دو تا مدل نمیتونه در یک ویو بشینه اگه داخل ویویی یک ویو دیگه میخواهید از Partial ها استفاده کنید.

RIG000
شنبه 19 مهر 1393, 17:00 عصر
مرسی. الان ویو من شامل این هست که جدول product من رو نشون بده.
اما این لایوت در چند ویو باید به کار گرفته بشه. من این این دلیل ازش استفاده کردم.

@model CodeNevis.Models.User
<div class="modal fade" id="modallogin" aria-hidden="true" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-header">

<div class=" modal-content">
<div class="modal-body">
@using (Html.BeginForm("login", "User", FormMethod.Post))
{
@Html.ValidationSummary(true)

<fieldset>
<legend>فرم ورود</legend>
<div class="editor-label">
@Html.Label("نام کاربری", new { @class = "label label-success" })
</div>
<div class="editor-field loginRegister">
@Html.TextBoxFor(model => model.PersonUserName)
@Html.ValidationMessageFor(model => model.PersonUserName)
</div>

<div class="editor-label">
@Html.Label("رمز ورود", new { @class = "label label-success" })
</div>
<div class="editor-field loginRegister">
@Html.TextBoxFor(model => model.PersonPassword, new { type = "password" })
@Html.ValidationMessageFor(model => model.PersonPassword)
</div>
<p>
<input class="btn btn-info" type="submit" value="ورود" />
</p>
<p>
@Html.ActionLink("رمز خورد را فراموش کرده ام", "Remember", "User", null, new { style = "color:red" })
</p>
</fieldset>
}

<div>
@Html.ActionLink("انصراف", "Index")
</div>
</div>
</div>
</div>
</div>

</div>
<!--////////////////////////
This bottom Code is for About Me!
-->
<div class="modal fade " id="modalinfo" role="dialog" tabindex="-1" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content" style="background-color: #24d4c8">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">بستن</span></button>
<div class="modal-title ">
<i class="fa fa-info-circle"></i>

<h4 class="text-center" style="color: red;">آنچه که آینده به ما می نگرد</h4>
</div>
</div>
<div class="modal-body" style="color: navy">
<p class="text-right">آنچه که آینده به ما می نگرد نگرش ما از ازمان حال است . برای داشتن آینده ای بهتر همه به نوعی در تلاش هستیم و در این مسیر پر پیچ و خم به کمک و یاری هم نیاز مندیم . ما نیز در این سایت به نوبه خود کمکی متناسب با نیاز شما به شما خواهیم کرد که امیدواریم مورد رضایت شما باشد</p>
</div>
<hr />
<div style="padding: 10px 10px 10px 10px">
<p class="text-right">شما در این سایت پروژ هایی را برای خود انتخاب میکنید که تما ما دارای مستندات مربوط به پروژه می باشند</p>
<p class="text-right">شما با کلیک بروی دکمه زیر می توانید لیست پروژ های ما را به همراه قیمت ببینید و با دکمه خرید میتوانید مستقیما به در گاه بانک وصل شده و خرید خود را با شیوه ای آسان انجام دهید</p>

<button type="button" class="btn btn-danger btn-lg">@Html.ActionLink("سی شارپ", "Index", "Product", new { role = "menuitem" }, null)</button>
</div>
<hr />
<hr />

<blockquote class="text-right pull-right">
<p>آیا قصد فروش پروژ ه های خود رادارید ؟ ما برای خرید پروژ های نوشته شده شما به زبان سی شارپ آماده ایم. با ما در قسمت ارسال پیام برای مدیر سایت در ارتباط باشید</p>
<footer>Msdn Microdoft Net FrameWork - Asp.net MVC4 And Design With BootStrap 3.2</footer>
</blockquote>
<hr />
<button type="button" class="btn btn-info" style="color: red" data-dismiss="modal">Close</button>
</div>
</div>
</div>
که یه div درست کردم که رو صفحه فعلی خودم لود شه و لاگین شه و دیگه به ویویی نره. حالا اینبخش از لایوت منه حالا لایوت رو میبرم رو 5 ویو دیگه که این 5 ویو هر کدارم 5 مدل دارن . من فکر میکنم باید یه فکری در مورد این مدل یوزر در داخل لایوت کنم. و نمیخام این مدل یوزر رو بردارم و برای لاگین شدن به ویو مخصوش برم . زیبایی برنامه از دست میره . میخام همین جا بمونه. و باید یه فکر واسه این مدل یوزر بکنم. اینو چیکارش کنم ؟

RIG000
شنبه 19 مهر 1393, 17:04 عصر
در ضمن یک مدل من داخل لایوت هست و یک مدل من داخل ویو . وقتی رو هم سوار میشن یکی میشن. چرا مایکروسافت فکری به حال این موضوع نکرده؟

parvizwpf
شنبه 19 مهر 1393, 17:17 عصر
معمولا توی لی اوت مدل اسنفاده نمیکنند آخه.

RIG000
شنبه 19 مهر 1393, 17:23 عصر
من اینو میدونم که چند تا مدل رو تو یه ویو مدل میشه ریخت و در یک ویو استفاده کرد اما مشکل منم اینه که تو لایوت هست خوب یه مدلم.

alireza_s_84
شنبه 19 مهر 1393, 17:43 عصر
ببینید من یه لایوت دارم که توش از user استفاده کردم

@model CodeNevis.Models.User
حالا این لایوتو رو یه کلاس دیگه هم پیاده کردم که
میشه این

@model IEnumerable<CodeNevis.Models.Product>
حالا اینو در نظر بگیرینکه این ارور رو میده

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[CodeNevis.Models.Product]', but this dictionary requires a model item of type 'CodeNevis.Models.User'.


من وقتی لود میکنم ویو رو این میره بجا اینکه product رو پر کنه به user میره. چه جوری حلش کنم؟
شما باید یک مدل ویو ترکیبی از دوتا مدلتون بسازید و اون رو به عنوان مدل به ویو بدین.
در اینجا مدل ویوی شما ترکیبی از دو کلاس CodeNevis.Models.User و IEnumerable<CodeNevis.Models.Product> میشه. پس شما یک کلاس به اسم دلخواه میسازی ، دوتا پراپرتی تعریف میکنی با همین دو نوع و این کلاس رو به عنوان ویو مدل معرفی میکنی.

ضمنا اگر قراره در Layout از مدل استفاده کنید میتونید از ViewBag و یا ChildAction برای اینکار استفاده کنید.

RIG000
شنبه 19 مهر 1393, 17:54 عصر
دمورد حرف ترکیب میرم انجام میدم. اما مشکل اینجاست که من قرار باشه این لایوت رو تو چندین تا ویو ببرم مجبورم برای هر کدوم از مدل ها با مدل یوزر یه کلاس جدید بسازم. حرف شما همون ویو مدل هست.
در مورد این هم
ضمنا اگر قراره در Layout از مدل استفاده کنید میتونید از ViewBag و یا ChildAction برای اینکار استفاده کنید.
نکردم این کار تا الان . نمونه یا چیزی در مورد child اکشن بیشتر توضیح بده دارید؟

RIG000
شنبه 19 مهر 1393, 18:04 عصر
ترکیبی نمیشه چون باید رو لایوت باشه . وقتی رو لایوت هست پس دیگه م ا لایوت رو رو چند ویو ببریم میشه چند تا ترکیبی تو لایوت . نمیشه.

RIG000
شنبه 19 مهر 1393, 18:08 عصر
@model CodeNevis.Models.User
<div class="modal fade" id="modallogin" aria-hidden="true" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-header">
<div class=" modal-content">
<div class="modal-body">
@using (Html.BeginForm("login", "User", FormMethod.Post))
{
@Html.ValidationSummary(true)

<fieldset>
<legend>فرم ورود</legend>
<div class="editor-label">
@Html.Label("نام کاربری", new { @class = "label label-success" })
</div>
<div class="editor-field loginRegister">
@Html.TextBoxFor(model => model.PersonUserName)
@Html.ValidationMessageFor(model => model.PersonUserName)
</div>

<div class="editor-label">
@Html.Label("رمز ورود", new { @class = "label label-success" })
</div>
<div class="editor-field loginRegister">
@Html.TextBoxFor(model => model.PersonPassword, new { type = "password" })
@Html.ValidationMessageFor(model => model.PersonPassword)
</div>
<p>
<input class="btn btn-info" type="submit" value="ورود" />
</p>
<p>
@Html.ActionLink("رمز خورد را فراموش کرده ام", "Remember", "User", null, new { style = "color:red" })
</p>
</fieldset>
}

<div>
@Html.ActionLink("انصراف", "Index")
</div>
</div>
</div>
</div>
</div>

</div>

چه زوری میتونم مقدار نام و پسورد رو به صورت viewbag ویا child اکشن ارسال کنم ؟ اگه میشه یه ادید بزنید کد من رو .

RIG000
شنبه 19 مهر 1393, 18:36 عصر
partial هم جواب نداد.

Server Error in '/' Application.The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[CodeNevis.Models.Product]', but this dictionary requires a model item of type 'CodeNevis.Models.User'.Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[CodeNevis.Models.Product]', but this dictionary requires a model item of type 'CodeNevis.Models.User'.

Source Error:



Line 79: </table>
Line 80:
Line 81: @Html.Partial("~/Views/_Sheard/_Partial/_PartialLoginUser.cshtml")
Line 82:
Line 83:

leila.net
شنبه 19 مهر 1393, 22:02 عصر
این نحوه کد نویسی و استفاده از مدل رو من تا حالا استفاده نکردم ولی به نظرم به جای استفاده از مدل می تونی اطلاعات کاربری رو با اژاکس بفرستی سمت سرور و از مدل تو layout استفاده نکنی . چون نهایتا شما دو تا مقدار رو قراره بفرستین سمت سرور ، خیلی راحت می تونین با این کار مشکل تون رو حل کنین.

leila.net
شنبه 19 مهر 1393, 22:05 عصر
partial هم جواب نداد.

Server Error in '/' Application.

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[CodeNevis.Models.Product]', but this dictionary requires a model item of type 'CodeNevis.Models.User'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[CodeNevis.Models.Product]', but this dictionary requires a model item of type 'CodeNevis.Models.User'.

Source Error:



Line 79: </table>
Line 80:
Line 81: @Html.Partial("~/Views/_Sheard/_Partial/_PartialLoginUser.cshtml")
Line 82:
Line 83:



خب این خطا هم کاملا مشخصه بوجود میاد شما فقط دارین product رو به view پاس میدین و داخل اونم خبری از user نیست!!!

RIG000
شنبه 19 مهر 1393, 22:23 عصر
درسته . اما ببینین یوزر تو لایوته . product تو ویو . واسه همین اینجوری خطا میزنه . چون به هر حال ایتم های product تو index هستن و ایتم های user تو لایوت . اول اینکه یه خطا واسه این داریم که نمیشناسه اینارو....
دوم اینکه اگه ما جدول سومی هم داشته باشیم و بخایم از این لایوت استفاده کنیم باید از این جدول و user دوباره یه ترکیب بزنیم و دوباره همین میشه. حالا من کلا" تو برنامم کلاس ترکیبی دارم . اما اینجوری هر روشیشو پیاده کردم نشد. اگه هم بشه باز تو مرحله های بعد به مشکل میخوره. یه دونه از این خطاها رو گذاشتم. من راه حل میخام که چه طوری میشه لایوت که یوزر توشه و 5 ویو دیگه داریم که هر کدوم یه کلاس مثل product دارن . ... تمامی هدف اینم بود که قابلیت modal کامپوننت bootsrap رو استفاده کنم تو این بخش.

par4parvaz
شنبه 19 مهر 1393, 23:39 عصر
شما باید توی لایوت برای قسمت ورود کاربر از یک partial استفاده کنی ، هم کد نویسی قشنگتر میشه ، هم این مشکلات و نداری.
بعد با یه خط دستور در لایوت @html.partial("partialname") اون پارشیال رو فراخوانی میکنی

RIG000
یک شنبه 20 مهر 1393, 00:28 صبح
124463
اینم خود partial

@model CodeNevis.Models.User
<div class="modal fade" id="modallogin" aria-hidden="true" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-header">
<div class=" modal-content">
<div class="modal-body">
@using (Html.BeginForm("login", "User", FormMethod.Post))
{
@Html.ValidationSummary(true)

<fieldset>
<legend>فرم ورود</legend>
<div class="editor-label">
@Html.Label("نام کاربری", new { @class = "label label-success" })
</div>
<div class="editor-field loginRegister">
@Html.TextBoxFor(model => model.PersonUserName)
@Html.ValidationMessageFor(model => model.PersonUserName)
</div>

<div class="editor-label">
@Html.Label("رمز ورود", new { @class = "label label-success" })
</div>
<div class="editor-field loginRegister">
@Html.TextBoxFor(model => model.PersonPassword, new { type = "password" })
@Html.ValidationMessageFor(model => model.PersonPassword)
</div>
<p>
<input class="btn btn-info" type="submit" value="ورود" />
</p>
<p>
@Html.ActionLink("رمز خورد را فراموش کرده ام", "Remember", "User", null, new { style = "color:red" })
</p>
</fieldset>
}

<div>
@Html.ActionLink("انصراف", "Index")
</div>
</div>
</div>
</div>
</div>

</div>

alireza_s_84
یک شنبه 20 مهر 1393, 10:22 صبح
وقتی شما سوالت رو درست نپرسی مطمئنا جوابهایی هم که میگیری درست نیست. اگر درست متوجه شده باشم ، شما میخواین توی Layout خودتون یک بخشی رو برای ورود کاربر قرار بدین که توی تمام صفحات نشون داده بشه. ولی چون مدل این قسمت با مدل ویووهای مختلف فرق داره دچار مشکل شدی. اگر این مشکل شماست باید یک Partial View بسازی مثلا Login_ (من معمولا اسم Pratialها رو با _ شروع میکنم) بعد مدل این Partial میشه CodeNevis.Models.User در نهایت توی Layout خودتون در محلی که قراره نمایش داده بشه اینجوری عمل کنید:
@Html.Partial("_Login", new CodeNevis.Models.User())
اگر هم میخوای کاربرای لاگین شده (احراز هویت شده ها) این قسمت رو نداشته باشن و براشون نمایش داده نشه میتونی اینجوری بنویسی:
@if (!Request.IsAuthenticated) {
@Html.Partial("_Login", new CodeNevis.Models.User())
}



ضمنا همیشه ویووهایی که حالت عمومی دارن (مثل همنی که اینجا ساختیم) رو توی پوشه ی Shared قرار بدین.

موفق باشی

RIG000
یک شنبه 20 مهر 1393, 11:13 صبح
یعنی واقعا ازت ممنونم. دیگه واقعا نامید شده بودم و متعجب که چرا راهی نداره.!!
کلا یه ویو دیگه ساخته بودم واسه انجامش.... الان میرم روش قبلی دوباره پیاده میکنم. متشکرم واقعا.

RIG000
یک شنبه 20 مهر 1393, 11:38 صبح
فقط یه سوال من درون هر پوشه ای که ویو های مربوط به کنترلر و یا هرچی که هست من یه پوشه پارشیال درست کردم و partial ها رو همه رو یک جا تعریف نمیکنم که اینجوری میدونم partial ای که درست کردم واسه کدوم ویو ها استفاده شده یا مربوط به چه کنترلری میشه .
حالا من

@Html.Partial("~/Views/User/_Partial/_PartialLoginUser.cshtml", new CodeNevis.ViewModel.LoginUser())
اینجوری بهش دسترسی پیدا میکنم و میدونم این پارشیال مربوط به یوزر من هست. هرچند که تو لایوت ازش استفاده کردم. ایراد که نداره اینجوری؟

alireza_s_84
یک شنبه 20 مهر 1393, 13:15 عصر
فقط یه سوال من درون هر پوشه ای که ویو های مربوط به کنترلر و یا هرچی که هست من یه پوشه پارشیال درست کردم و partial ها رو همه رو یک جا تعریف نمیکنم که اینجوری میدونم partial ای که درست کردم واسه کدوم ویو ها استفاده شده یا مربوط به چه کنترلری میشه .
حالا من

@Html.Partial("~/Views/User/_Partial/_PartialLoginUser.cshtml", new CodeNevis.ViewModel.LoginUser())
اینجوری بهش دسترسی پیدا میکنم و میدونم این پارشیال مربوط به یوزر من هست. هرچند که تو لایوت ازش استفاده کردم. ایراد که نداره اینجوری؟
نه ایرادی نداره ، یکی از راه های فراخوانی و ارجاع به یک ویوو دادن مسیر کامل اون هست.