PDA

View Full Version : اعتبار سنجی remote validation



Wily_Fox
چهارشنبه 12 تیر 1392, 12:02 عصر
با سلام و خسته نباشید

من جهت بررسی ایمیل کاربران هنگام Register کردن از remote validation میخوام استفاده کنم. کدهای زیر رو نوشتم اما هیچ عکسالعملی انجام نمیده!!

در RegisterModel کد زیر رو نوشتم:

[Required(ErrorMessage = "ایمیل تکمیل نشده است.")]
[Display(Name = "ایمیل")]
[DataType(DataType.EmailAddress, ErrorMessage = "آدرس ایمیل وارد کنید.")]
[System.Web.Mvc.Remote(action: "CheckUserNameAndEmail",
controller: "Account",
HttpMethod = "POST",
ErrorMessage = "ایمیل وارد شده قبلا در سیستم ذخیره شده است")]
public string UserName { get; set; }


در کنترل Account اکشنی بصورت زیر نوشتم:


[HttpPost]
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public ActionResult CheckUserNameAndEmail(string UserName)
{
var item = context.UserProfiles.Where(p => p.UserName == UserName.ToLower()).FirstOrDefault();
if(item!=null)
return Json(false);
return Json(true);
}


هنگامی که در View مربوطه مقادیر مورد نظر رو وارد می کنم و روی submit کلیک می کنم هیچ اتفاقی نمی افته!

از طرفی اگر به کد زیر توجه کنید در View مربوطه Validation های JQuery لود شده:



<li>
<label for="UserName">ایمیل</label>
<input class="text-box single-line" data-val="true" data-val-remote="ایمیل وارد شده قبلا در سیستم ذخیره شده است" data-val-remote-additionalfields="*.UserName" data-val-remote-type="POST" data-val-remote-url="/Account/CheckUserNameAndEmail" data-val-required="ایمیل تکمیل نشده است." id="UserName" name="UserName" type="email" value="" />
</li>


متشکرم

parvizwpf
چهارشنبه 12 تیر 1392, 22:06 عصر
بریک پوینت بزارید ببینید اصلا اون اکشن اجرا میشه؟

Wily_Fox
پنج شنبه 13 تیر 1392, 00:09 صبح
اتفاقا این کارو کردم. درواقع هیچ درخواستی از طرف کلاینت به سمت سرور ارسال نمیشه.

robinashly
جمعه 14 تیر 1392, 12:20 عصر
سلام من فکر میکنم این دستور var item = context.UserProfiles.Where(p => p.UserName == UserName.ToLower()).FirstOrDefault مشکل داره مخصوصا قسمتی که نوشتید UserName.ToLower() چون خود من یکبار این کار رو کردم هی ازم ایراد میگرفت و error میداد اگه برنامه رو trace کنید به نتایج خوبی میرسید .

موفق باشید

Wily_Fox
جمعه 14 تیر 1392, 22:08 عصر
دوست عزیز اصلا سمت سرور درخواستی ارسال نمیشه!

Saeed_m_Farid
شنبه 15 تیر 1392, 14:11 عصر
سلام
اولاً AccountController خودش Duplicate Validation داره، بعد هم HttpMethod = "POST" برای چی هست؟
اکشن رو بصورت زیر :
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public JsonResult CheckUserNameAndEmail(string UserName)
{
return Json(
(context.UserProfiles.FirstOrDefault(p =>
string.Equals(p.UserName,
UserName,
StringComparison.InvariantCultureIgnoreCase)) == null)
, JsonRequestBehavior.AllowGet);
}
و Data Annotation ها رو به اینصورت تغییر بدین، ببینید درست میشه؟
[Required(ErrorMessage = "ایمیل تکمیل نشده است.")]
[Display(Name = "ایمیل")]
[DataType(DataType.EmailAddress, ErrorMessage = "آدرس ایمیل وارد کنید.")]
[Remote("CheckUserNameAndEmail", "Account", ErrorMessage = "ایمیل وارد شده قبلا در سیستم ذخیره شده است")]
public override string UserName { get; set; }

Wily_Fox
شنبه 15 تیر 1392, 15:36 عصر
نه هیچ اتفاقی نیافتاد باز. دقیقا مثل قبل هیچ درخواستی سمت سرور ارسال نمیشه

Saeed_m_Farid
شنبه 15 تیر 1392, 17:29 عصر
شما میگین کلاً این اکشن فایر نمیشه؟ پس میشه حدس زد که مشکل احتمالاً تو تنظیمات web.config هست، ولی باز هم برای اطمینان موارد زیر رو چک کنید:


اول اکشنی که تصحیح شد، [HttpGet] هم گذاشته و بازم امتحان کنید.
ببینید این تنظیمات در web.config درست هستند؟

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

مطمئن بشید که jQuery و کتابخانه های validation فعال هستند؟
اگه تو Partial view دارید از اسکریپت استفاده می کنید، اینجا (http://stackoverflow.com/questions/14134949/jquery-client-side-validation-not-working-in-mvc3-partial-view/14135013#14135013) رو ببینید.
شاید -علیرغم کدی که اینجا گذاشتید- اکشن شما تو کنترلر درستی قرار نگرفته! مطمئن بشید که اکشن تو AccountController هست.
نهایتاً با یه Inspector (مثل Fiddler (http://fiddler2.com/) یا Firebug فایرفاکس) تست کنید، ببینید تو متد GET چی دارین؟

از لحاظ کد اکشن که بنظر میرسه مراحل (http://msdn.microsoft.com/en-us/library/gg508808%28v=vs.98%29.aspx) درست هستن.
_______________

نکته: یه مسئله مهم تر اینه که شما با اینکار (یعنی بررسی غیر تکراری بودن UserName تو مدل)، کلاً نمیذارین هیچ نام کاربری که سمت سرور هست، کاری روش صورت بگیره و این شامل ویرایش اطلاعات کاربری هم میشه؛ چون نام کاربری موجود هست که میخواد ویرایش بشه دیگه، و چون موجود هست شما نمی تونید برید مرحله POST؛ باید واسه اون هم یه فکری بکنید (http://edspencer.me.uk/2011/07/19/using-asp-net-mvc-remote-validation-the-real-world-additionalfields/) ...

Wily_Fox
شنبه 15 تیر 1392, 21:58 عصر
اول اکشنی که تصحیح شد، [HttpGet] هم گذاشته و بازم امتحان کنید.
اصلاح شد هیچ تغییری حاصل نشد

ببینید این تنظیمات در web.config درست هستند؟
تنظیمات درست است

مطمئن بشید که jQuery و کتابخانه های validation فعال هستند؟
جی کوری فعال است و بدرستی اعتبارسنجی می کند

اگه تو Partial view دارید از اسکریپت استفاده می کنید، اینجا رو ببینید.
من از فایل Register خود MVC4 موجود در پوشه Views/Account استفاده می کنم و هنوز فرصت نکردم اون رو تغییر بدم

نهایتاً با یه Inspector (مثل Fiddler یا Firebug فایرفاکس) تست کنید، ببینید تو متد GET چی دارین؟
این رو نتونستم چک کنم. یعنی بلد نیستم چطوری با فایرفاکس باید متد get رو چک کنم. inspector رو run میکنم اما نمی دونم باید از کجا چک کنم


نکته: یه مسئله مهم تر اینه که شما با اینکار (یعنی بررسی غیر تکراری بودن UserName تو مدل)، کلاً نمیذارین هیچ نام کاربری که سمت سرور هست، کاری روش صورت بگیره و این شامل ویرایش اطلاعات کاربری هم میشه؛ چون نام کاربری موجود هست که میخواد ویرایش بشه دیگه، و چون موجود هست شما نمی تونید برید مرحله POST؛ باید واسه اون هم یه فکری بکنید ...

در مورد این میشه بیشتر توضیح بدید؟
متشکرم

parvizwpf
شنبه 15 تیر 1392, 22:06 عصر
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]


اینو حذف کنید.
آیا اکشن شما از نوع پارچیال ویو هست؟ آیا ویو براش ساختید؟

اینها باید در ویوی مورد نظر برای ولیدیشن فراخانی بشن:


<script src="~/Content/jquery-1.7.1.js" type="text/javascript"></script>
<script src="~/Content/jquery.validate.js" type="text/javascript"></script>
<script src="~/Content/jquery.validate.unobtrusive.js" type="text/javascript"></script>
من الن اینها رو که ست میکنم در ست جواب میده.

Wily_Fox
شنبه 15 تیر 1392, 22:30 عصر
آیا اکشن شما از نوع پارچیال ویو هست؟ آیا ویو براش ساختید؟

خیر view داره

Wily_Fox
شنبه 15 تیر 1392, 22:31 عصر
اینا همه لود شدن


<script src="/Scripts/modernizr-2.5.3.js"></script>

<script src="/Scripts/jquery-1.7.1.js"></script>
<script src="/Scripts/jquery-ui-1.8.20.js"></script>
<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="/Scripts/jquery.balloon.js"></script>

Saeed_m_Farid
یک شنبه 16 تیر 1392, 14:10 عصر
من از فایل Register خود MVC4 موجود در پوشه Views/Account استفاده می کنم و هنوز فرصت نکردم اون رو تغییر بدم
این رو نتونستم چک کنم. یعنی بلد نیستم چطوری با فایرفاکس باید متد get رو چک کنم. inspector رو run میکنم اما نمی دونم باید از کجا چک کنم
در مورد این میشه بیشتر توضیح بدید؟




قبلاً هم عرض کردم، اکشن Register خودش Username رو برای تکراری نبودن بررسی میکنه، اگه هدفتون یادگیری Remote Validation نیست، لازم نیست اینهمه مصیبت بکشید.
Firebug هم Inspector برای پیغام های HTTP داره ولی Fiddler خیلی بهتره؛ برای Firebug برید تو برگۀ Net و بعد زیربرگۀ HTML می تونید کوکی و هدر و ... رو ببینید:
106772
یعنی اینکه UserId رو هم باید پاس بدین به تابع اکشن Remote Validation و تو تابع بررسی کنید اگه بزرگتر از صفر بود، بیخیال بررسی موجود بودن در جدول کاربران بشید
برای Data annotation هم یه AdditionalFields بعنوان UserId اضافه کنید(لینکش رو دادم).

Wily_Fox
یک شنبه 16 تیر 1392, 16:53 عصر
متشکرم از وقتی که گذاشتید

دقیقا درسته. هنگام Create کردن این بررسی انجام میشه.

اگه بخوام این بررسی توسط Ajax اتفاق بیافته باید چیکار کنم؟

Saeed_m_Farid
یک شنبه 16 تیر 1392, 18:37 عصر
خوب این کارا که می کنیم، میخوایم Ajax ای این بررسی صورت بگیره، حالا اگه این گیر شما حل بشه، قراره مثلاً عملیات رفت و برگشت به سرور رو کاربر متوجه نشه و همونجا قرمز بهش اخطار بده ...

Wily_Fox
یک شنبه 16 تیر 1392, 20:20 عصر
درسته. بهمین جهت من خواستم از روش remote validation استفاده کنم. که متاسفانه به مشکل برخوردم.

امکانش هست یه sample بزارید تا من بتونم کامل بررسی کنم و با کدی که نوشتم مقایسه کنم.

helpsos
سه شنبه 16 اردیبهشت 1393, 10:57 صبح
سلام
می توانی از روش زیر استفاده کنی
داخل مدل:[Display(Name = "کدملی")] [Required(ErrorMessage = "لطفا {0} را وارد نمایید")]
[Remote("CheckExistNationalCode","Enrol",HttpMethod="Post",ErrorMessage="کدملی تکراری است")]
public string StudentNationalCode { get; set; }
داخل کنترلر هم بنویس
[HttpPost] [OutputCache(Location = System.Web.UI.OutputCacheLocation.None, NoStore = true)]
public virtual ActionResult CheckExistNationalCode(string studentNationalCode)
{
if (studentNationalCode == _studentService.ExistNationalCode(studentNationalC ode)) return Json(true);
return Json(false);
}
تشکر ظاهر امر است برای باطن صلوات : **.: االهم صل علی محمد و آل محمد و عجل فرجهم :.**

Dr.Bronx
سه شنبه 16 اردیبهشت 1393, 16:11 عصر
اتفاقی که میفته این هست که یک خطا در Validation ها رخ می دهد .
برای اینکه متن خطا رو ببینید کتابخانه های jquery validate رو حذف کنید و امتحان کنید .
اینبار به صفحه خطا راهنمایی میشید .
نمی دونم این اتفاق چرا رخ میده اما خوب برای من زیاد پیش اومده .

موفق باشید ./