PDA

View Full Version : ارور The model item passed into the dictionary is of type 'System.String', but this dictionary requi



نیکناز
جمعه 25 مرداد 1392, 07:54 صبح
سلام من می تونم به جای این که یه مدل رو کامل به view پاس بدم ، فقط بعضی از فیلد هاشو پاس بدم؟
لاگ این من پارتیال ویو هست .
من این کار و کردم :

کلاس:




public class UsersClass
{
public class LogOn
{
public string username { get; set; }
public string password_User { get; set; }

}
}


کنترلر:



[HttpGet]

public ActionResult LogOn(string returnUrl)
{

using (var db = new MyContext())
{

var AllFeatureToLog = db.tbl_profile.Select(u => new UsersClass.LogOn { username = u.username, password_User = u.password_User }).ToList();


return PartialView(AllFeatureToLog);
}
}





پارتیال ویو:




@model MyProject.Models.UsersClass.LogOn

<div class="sidebar-line"><span></span></div>

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<form class="signin-form">
<p>اگر شما نیاز به هر گونه کمک داشتید لطفا از طریق فرم <a href="#">تماس با ما </a>در داشبورد خود با ما تماس بگیرید</p>

@Html.TextBoxFor(m =>m.username, new { @id = "username", @class = "input-block-level", @placeholder = "* نام کاربری خود را وارد کنید" })
@Html.TextBoxFor(m => m.password_User, new { @id = "password", @class = "input-block-level", @placeholder = "* گذر واژه خود را تکرار کنید" })
@Html.ValidationMessage("LoginError")
<label for="inputPassword">
<a href="#">فراموش کرده اید؟</a>
</label>
<label class="checkbox">
<input type="checkbox">مرا به خاطر بسپار</label>
<button class="btn btn-medium btn-general input-block-level" type="submit">ورود به حساب کاربری</button>
</form>
}




ولی روی خط
@{ Html.RenderPartial("LogOn", "Account"); }
چنین اروری می ده :


The model item passed into the dictionary is of type 'System.String', but this dictionary requires a model item of type 'MyProject.Models.UsersClass+LogOn'.

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


@model IEnumerable<MyProject.Models.UsersClass.LogOn>



رو هم گذاشتم ولی ...Html.TextBoxFor(m =>m.username ها مشکل داره چون در این حالت چیزی به نام username یا User_pass این طوری که من تعریف کردم نمی شناسه .

hakim22
جمعه 25 مرداد 1392, 08:33 صبح
اول توصیه میکنم ابزار Resharper رو نصب بکنید.
دوم اینکه همیشه یادتون باشه خطا یابی یک برنامه از نوشتن خود اون برنامه سخت تره ، پس سخت کد نویسی نکنید که بعدا رفع خطاش خیلی سخت بشه.
استفاده از LINQ خوندن کد رو مشکل میکنه. مخصوصا اینکه شما چندین عملیات رو در یک خط کد اجرا میکنید. یا اینو به یک تابع دیگه منتقل کنید و مطمئن بشید درست عمل میکنه یا اینکه ساده تر پیادش کنید.
البته باید با Debugger تست کنید .
در این خط لیست ندارید :

var AllFeatureToLog = db.tbl_profile.Select(u => new UsersClass.LogOn { username = u.username, password_User = u.password_User }).ToList();


return PartialView(AllFeatureToLog);


وقتی یک شی دارید دلیلی نداره از .ToList(); استفاده کنید. درضمن دلیلی نداره در View از IEnumerable استفاده کنید. این دوتارو حذف کنید.

نیکناز
جمعه 25 مرداد 1392, 11:09 صبح
من این کار و قبلا کردم .
tolist() و Ienumarable رو همین طور . ولی همچنان ارور string رو می ده .
resharper کمکی به من می کنه؟

parvizwpf
جمعه 25 مرداد 1392, 11:20 صبح
بنظرم مدل شما یک شی از logon یرنمیگردونه. از singleOrDefault در انتهای کوئری استفاده کنید.tolist نمیخواد.
مدل هم باید همین باشه:
@model MyProject.Models.UsersClass.LogOn

نیکناز
جمعه 25 مرداد 1392, 12:00 عصر
نه بی تاثیر

parvizwpf
جمعه 25 مرداد 1392, 12:07 عصر
یه جورایی بنظرم اولش چیزی بهش پاس نمیشه درسته چون شما هم حالت get ,post رو با هم پیاده کردید . اولین بار که داره صفحه لاگ «ان میاد آیا مدلی پاس میشه. مدل چیه برید با بریک پوینت بررسی کنید اینجا بگید.

نیکناز
جمعه 25 مرداد 1392, 12:57 عصر
خوب می خوام وقتی لاگین میاد بالا همین مدل که فقط دو تا فیلد توشه پاس بشه .
من نمی تونم با بریک پوینت برم تو بخش [HttpGet] ، نمی ره توش . مستقیم میره رو این ارور.




[HttpGet]

public ActionResult LogOn(string returnUrl)
{

using (var db = new MyContext())
{

var AllFeatureToLog = db.tbl_profile.Select(u => new UsersClass.LogOn { username = u.username, password_User = u.password_User });

return PartialView(AllFeatureToLog);
}
}



[HttpPost]
public ActionResult LogOn(UsersClass.LogOn loginInfo, string returnUrl)
{

if (this.ModelState.IsValid)
{
if (UserClass.UserValidation(loginInfo.username, loginInfo.password_User) != null)
{
FormsAuthentication.SetAuthCookie(loginInfo.userna me, true);
if (zUsersClass.shouldRedirect(returnUrl))
{
return Redirect(returnUrl);
}
FormsAuthentication.RedirectFromLoginPage(loginInf o.username, true);
}
}
this.ModelState.AddModelError("LoginError", "نام کاربری یا گذرواژه اشتباه است");
ViewBag.Error = "ورود ناموفق ! لطفا اطمینان پیدا کنید که نام کاربری یا گذرواژه را صحیح وارد کردید";



return PartialView(loginInfo);
}

hakim22
جمعه 25 مرداد 1392, 13:00 عصر
اول یک BreakPoint در return PartialView(AllFeatureToLog); بزارید و مطمئن بشید شی است و نه string

حل مشکل شما ساده تر از اینهاست. اول کلاس logon رو از LINQ زیر دربیارید

var AllFeatureToLog = db.tbl_profile.Select(u => new UsersClass.LogOn { username = u.username, password_User = u.password_User }).ToList();


بجای select از FirstOrDefault استفاده کنید. و ساختن شی جدید LogOn رو به یک خط دیگه منتقل کنید.
اول مطمئن بشید نیجه ای از First بیرون میاد بعد مقدایر اون رو به شی AllFeatureToLog منتقل کنید.