PDA

View Full Version : مشکلی در استفاده از strongly Type



آرام جان گل
یک شنبه 29 دی 1392, 14:15 عصر
با سلام
من در فرم لاگین مدل مربوط به Users را می فرستم .
می دونید که فرم لاگین تنها username و password را داره .
اما مدل کاربر تمامی اطلاعات کاربر مثل ایمیل و نام و نام خانوادگی و تلفن و ..... را به همراه داره .

زمانی که من فرم را برای کنترلر ارسال می کنم چون مدل را می فرسته به دنبال بقیه اطلاعات می گرده و اونها خالی هستند گیر می ده که خالی بودن اونها را از طریق anotation های تعریف شده در مدل می فهمه و modelState فالس هست .

حالا سوالی که من دارم اینه که آیا می تونم برای فرم هایی که تنها از بخشی از اطلاعات استفاده می کنن از strongly type و model binding استفاده کرد؟ یا اینکه کاری که می کنم عیر اصولی هست ؟

در حقیقت من نمی خوام داده ای را نشون بدم که از strongly Type استفاده کردم می خواستم موقع فرستادن داده ها راحت باشم و نیازی به چک کردن داده ها نداشته باشم و خودش با anotation ها اونها را چک کند.

ممنون راهنمایی کنید
نمونه کدم را هم نمی تونم بزارم چون در هنگام اجازه بیشتر از 78024 کاراکتر را ندارم کدم را تاپیک بعدی می زارم

sunn789
یک شنبه 29 دی 1392, 21:40 عصر
سلام
تو ام وی سی 5 بهترین راه حل استفاده از مدل اکانت خود ام وی سی است در در قسمت .... میتونید تغییر در وارد کردن اطلاعات بدین ،
اما اگر در مدل خودتون نال نبودن رو نوشته باشید فقط میتونید [required] رو بردارید
این چیزی بود که از اطلاعات شما به دست اومد اگه گفته بودین که مدا کاربر رو خودتون ایجاد کردین و یا از مدل پیش فرض ام وی سی استفادده کردین بهتر میشد.
موفق باشید

alireza_s_84
یک شنبه 29 دی 1392, 23:39 عصر
با سلام
من در فرم لاگین مدل مربوط به Users را می فرستم .
می دونید که فرم لاگین تنها username و password را داره .
اما مدل کاربر تمامی اطلاعات کاربر مثل ایمیل و نام و نام خانوادگی و تلفن و ..... را به همراه داره .

زمانی که من فرم را برای کنترلر ارسال می کنم چون مدل را می فرسته به دنبال بقیه اطلاعات می گرده و اونها خالی هستند گیر می ده که خالی بودن اونها را از طریق anotation های تعریف شده در مدل می فهمه و modelState فالس هست .

حالا سوالی که من دارم اینه که آیا می تونم برای فرم هایی که تنها از بخشی از اطلاعات استفاده می کنن از strongly type و model binding استفاده کرد؟ یا اینکه کاری که می کنم عیر اصولی هست ؟

در حقیقت من نمی خوام داده ای را نشون بدم که از strongly Type استفاده کردم می خواستم موقع فرستادن داده ها راحت باشم و نیازی به چک کردن داده ها نداشته باشم و خودش با anotation ها اونها را چک کند.

ممنون راهنمایی کنید
نمونه کدم را هم نمی تونم بزارم چون در هنگام اجازه بیشتر از 78024 کاراکتر را ندارم کدم را تاپیک بعدی می زارم
یک مدل برای Login خود تعریف کنید
نمونه مدل برای Login:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace Nonama.Models
{
public class Login
{
[Display(Name = "نام کاربری")]
[Required(AllowEmptyStrings = false, ErrorMessage = "نام کاربری را وارد کنید.")]
public string Username { get; set; }

[Display(Name = "گذر واژه")]
[Required(AllowEmptyStrings = false, ErrorMessage = "گذر واژه را وارد کنید.")]
public string Password { get; set; }

[Display(Name = "مرا به خاطر بسپار")]
public bool RememberMe { get; set; }
}
}

sunn789
دوشنبه 30 دی 1392, 00:24 صبح
میشه کمک کنید >
ببخشید میپرسم ، اینکه فرمودین یه مدل تعریف کنن مگه مدل اماده شدش توی ام وی سی نیست اینو پرسیدم یاد بگیرم ، احتمالاً یه جایی من هم اشتباه میکنم.
با تشکر

alireza_s_84
دوشنبه 30 دی 1392, 12:02 عصر
میشه کمک کنید >
ببخشید میپرسم ، اینکه فرمودین یه مدل تعریف کنن مگه مدل اماده شدش توی ام وی سی نیست اینو پرسیدم یاد بگیرم ، احتمالاً یه جایی من هم اشتباه میکنم.
با تشکر

بستگی به نوع پروژه داره ، اگه شما یک پروژه از نوع MVC Web Application بسازید بطور خودکار برای شما مدل رو میسازه ولی در هرحال شما برای هر صفحه ای میتونید یک مدل بسازید ، برای مثال اگر برای ورود به سایت از Captcha استفاده میکنید میتونید اون رو به مدلتون اضافه کنید.

آرام جان گل
دوشنبه 30 دی 1392, 21:40 عصر
باسلام
کاربر alireza یک سوال داشتم
چطوری MVC خودش مدل را برای من می سازه ؟
این در حالی است که مدل به هیچ مدلی از دیتابیس Map نیست .
ختما MVC که به حالت DBFirst است این کار را می کنه ؟
ممکنه مطلبی که می گید در CodeFirst وجود داشته باشه ؟

لطفا راهنمایی کنید ممنون

آرام جان گل
دوشنبه 30 دی 1392, 21:45 عصر
راستی سوال دیگری که داشتم از کاربر alireza :
چرا مرا به خاطر بسپار را در مدل قرار داده اید ؟ آیا کاربرد خاصی داره که اون را توی مدل تعریف کرده اید؟

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

alireza_s_84
دوشنبه 30 دی 1392, 22:55 عصر
باسلام
کاربر alireza یک سوال داشتم
چطوری MVC خودش مدل را برای من می سازه ؟
این در حالی است که مدل به هیچ مدلی از دیتابیس Map نیست .
ختما MVC که به حالت DBFirst است این کار را می کنه ؟
ممکنه مطلبی که می گید در CodeFirst وجود داشته باشه ؟

لطفا راهنمایی کنید ممنون

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

alireza_s_84
دوشنبه 30 دی 1392, 23:02 عصر
راستی سوال دیگری که داشتم از کاربر alireza :
چرا مرا به خاطر بسپار را در مدل قرار داده اید ؟ آیا کاربرد خاصی داره که اون را توی مدل تعریف کرده اید؟

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

شما وقتی میخوای وارد بشی ممکنه گزینه "یادآوری من یا مرا به خاطر بسپار" توی فرم لاگین داشته باشی که با علامت خودرن اون برای دفعات بعد کاربر نیازی به وارد کردن نام کاربری و رمز عبور خودش نداره. حالا در سمت سرور هنگام ست کردن کوکی و هویت دادن به کاربر شما میتونید با یک if چک کنی و اگر true بود کوکی رو با تاریخ انقضای نامحدود تعریف میکنی در غیراینصورت فقط در حد همون Session تعریف میشه. من توی مدل برای اون یک خصوصیت تعریف کردم تا نیازی به چک کردن شرط نداشته باشم و اینکار رو بعهده ی Model Binding گذاشتم.
به نموه کدی که میذارم توجه کن متوجه میشی:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(Login model, string ReturnUrl)
{
if (Request.IsAuthenticated)
{
return RedirectToAction("Index", "Home");
}

if (ModelState.IsValid)
{
switch (user.Validate(model.Username, model.Password))
{
case ValidateUserStatus.InvalidPassword:
case ValidateUserStatus.InvalidUsername:
{
ModelState.AddModelError("InvalidLogin", "کاربری با اطلاعات وارد شده ، یافت نشد!");
break;
}
case ValidateUserStatus.IsLockedOut:
{
ModelState.AddModelError("InvalidLogin", "حساب کاربری شما مسدود شده است ، جهت اطلاع بیشتر با سرپرست تارنما تماس بگیرید!");
break;
}
case ValidateUserStatus.IsNotApproved:
{
User newUser = user.Select(model.Username);
string fullName = string.Format("{0} {1}", newUser.FirstName, newUser.LastName);
EmailManager.SendConfirmMail(fullName, model.Username, "غیر قابل دید", newUser.Email);
ModelState.AddModelError("InvalidLogin", "شما رایانامه ی خود را تایید نکرده اید ، هم اکنون رایانامه ای حاوی پیوند تایید برای شما ارسال شد.");
break;
}
case ValidateUserStatus.IsValid:
{
FormsAuthentication.SetAuthCookie(model.Username, model.RememberMe);
Session["UserInfo"] = user.Select(model.Username);
return RedirectToLocal(ReturnUrl);
}
case ValidateUserStatus.TryLater:
{
ModelState.AddModelError("InvalidLogin", "میزان ورود اطلاعات اشتباه ، بیش از حد مجاز است ، پس از 30 دقیقه دوباره برای ورود تلاش کنید!");
break;
}
default:
{
ModelState.AddModelError("InvalidLogin", "در عملیات درخواستی ایرادی صورت گرفته است ، دوباره تلاش کنید و در صورت مشاهده این پیام به سرپرست تارنما گزارش دهید!");
break;
}
}

}

return View(model);
}


کاربردش رو اینجا ببینید:
case ValidateUserStatus.IsValid:
{
FormsAuthentication.SetAuthCookie(model.Username, model.RememberMe);
Session["UserInfo"] = user.Select(model.Username);
return RedirectToLocal(ReturnUrl);
}