PDA

View Full Version : سوال: چک کردن customAttribute در سمت کاربر



Iran58
دوشنبه 18 دی 1396, 14:10 عصر
سلام
فرض کنید custom attribute به اسم CodeMelli ایجاد کرده ام و بصورت زیر بکاربرده ایم

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using WebApplication1.Helper;


namespace WebApplication1.Models
{
public class Person
{
[Required]
public string Name { get; set; }
[CodeMelli("test")]
public string code { get; set; }
}
}

و در صفحه view کد زیر را نوشته ایم

@model WebApplication1.Models.Person


@{
Layout = null;
}


<!DOCTYPE html>


<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>View</title>
</head>
<body>
<div>
@using (Html.BeginForm("About", "Home", FormMethod.Post))
{
<p>
@Html.LabelFor(m => m.Name)
@Html.TextBoxFor(m => m.Name)
@Html.ValidationMessageFor(m => m.Name)
</p>
<p>
@Html.LabelFor(m => m.code)
@Html.TextBoxFor(m => m.code)
@Html.ValidationMessageFor(m => m.code)
</p>
<input type="submit" value="ثبت نام" />
}
</div>
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
</body>
</html>
کد در سمت سرور درسست کار میکند اما متاسفانه سمت کاربر کارنمیکند
برای حل این مشکل باید چکار کنم

Moien Tajik
سه شنبه 19 دی 1396, 08:50 صبح
وقتی jquery unobtrusive فعال باشه ، Validation سمت کاربر ابتدا اجرا میشه.

بعنوان مثال برای همون کد ملی که خودتون نوشتید ، Attribute اش به این شکل هست :

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
public class NationalCodeAttribute : ValidationAttribute
{
#region IsValidNationalCode بررسی صحت کدملی


public NationalCodeAttribute(string errorMessage)
{
ErrorMessage = errorMessage;
}


public override bool IsValid(object value)
{
if (value == null) return false;
if (IsValidNationalCode(value.ToString()) == false) return false;
return true;
}


public bool IsValidNationalCode(string nationalcode)
{
if (string.IsNullOrEmpty(nationalcode)) return false;
if (!new Regex(@"\d{10}").IsMatch(nationalcode)) return false;


var array = nationalcode.ToCharArray();


var allDigitEqual = new[] { "0000000000", "1111111111", "2222222222", "3333333333", "4444444444", "5555555555", "6666666666", "7777777777", "8888888888", "9999999999" };
if (allDigitEqual.Contains(nationalcode)) return false;
var j = 10;
var sum = 0;
for (var i = 0; i < array.Length - 1; i++)
{
sum += int.Parse(array[i].ToString(CultureInfo.InvariantCulture)) * j;
j--;
}
var div = sum / 11;
var r = div * 11;
var diff = Math.Abs(sum - r);
if (diff <= 2)
{
return diff == int.Parse(array[9].ToString(CultureInfo.InvariantCulture));
}
var temp = Math.Abs(diff - 11);
return temp == int.Parse(array[9].ToString(CultureInfo.InvariantCulture));
}
#endregion
}


نحوه استفاده ازش هم :

[Required(ErrorMessage = "وارد کردن {0} الزامی است !")]
[Display(Name = "کدملی")]
[NationalCode("کدملی وارد شده معتبر نمیباشد !")]
public string NationalCode { get; set; }



و در ویو :

@Html.TextBoxFor(m => m.Username, new { @class = "form-control", placeholder = "کد ملی ( نام کاربری )" })
@Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" })


@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}


اگر باز هم به نتیجه نرسیدین باید اینترفیس IClientValidatable رو پیاده سازی کنید :
https://stackoverflow.com/a/4747466
http://www.c-sharpcorner.com/UploadFile/abhikumarvatsa/enabling-client-side-validation-on-custom-data-annotations-w/
https://forums.asp.net/t/1639666.aspx?Client+Side+validation+with+custom+va lidation+attribute

Iran58
سه شنبه 19 دی 1396, 09:42 صبح
وقتی jquery unobtrusive فعال باشه ، Validation سمت کاربر ابتدا اجرا میشه.

بعنوان مثال برای همون کد ملی که خودتون نوشتید ، Attribute اش به این شکل هست :

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
public class NationalCodeAttribute : ValidationAttribute
{
#region IsValidNationalCode بررسی صحت کدملی


public NationalCodeAttribute(string errorMessage)
{
ErrorMessage = errorMessage;
}


public override bool IsValid(object value)
{
if (value == null) return false;
if (IsValidNationalCode(value.ToString()) == false) return false;
return true;
}


public bool IsValidNationalCode(string nationalcode)
{
if (string.IsNullOrEmpty(nationalcode)) return false;
if (!new Regex(@"\d{10}").IsMatch(nationalcode)) return false;


var array = nationalcode.ToCharArray();


var allDigitEqual = new[] { "0000000000", "1111111111", "2222222222", "3333333333", "4444444444", "5555555555", "6666666666", "7777777777", "8888888888", "9999999999" };
if (allDigitEqual.Contains(nationalcode)) return false;
var j = 10;
var sum = 0;
for (var i = 0; i < array.Length - 1; i++)
{
sum += int.Parse(array[i].ToString(CultureInfo.InvariantCulture)) * j;
j--;
}
var div = sum / 11;
var r = div * 11;
var diff = Math.Abs(sum - r);
if (diff <= 2)
{
return diff == int.Parse(array[9].ToString(CultureInfo.InvariantCulture));
}
var temp = Math.Abs(diff - 11);
return temp == int.Parse(array[9].ToString(CultureInfo.InvariantCulture));
}
#endregion
}


نحوه استفاده ازش هم :

[Required(ErrorMessage = "وارد کردن {0} الزامی است !")]
[Display(Name = "کدملی")]
[NationalCode("کدملی وارد شده معتبر نمیباشد !")]
public string NationalCode { get; set; }



و در ویو :

@Html.TextBoxFor(m => m.Username, new { @class = "form-control", placeholder = "کد ملی ( نام کاربری )" })
@Html.ValidationMessageFor(model => model.Username, "", new { @class = "text-danger" })


@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}


اگر باز هم به نتیجه نرسیدین باید اینترفیس IClientValidatable رو پیاده سازی کنید :
https://stackoverflow.com/a/4747466
http://www.c-sharpcorner.com/UploadFile/abhikumarvatsa/enabling-client-side-validation-on-custom-data-annotations-w/
https://forums.asp.net/t/1639666.aspx?Client+Side+validation+with+custom+va lidation+attribute
سلام
متاسفانه سمت کلاینت کارنکرد

aminpourazadeh
چهارشنبه 01 اسفند 1397, 15:36 عصر
سلام
متاسفانه سمت کلاینت کارنکرد
این مشکل چطور حل میشود؟ من هم دقیقا این مشکل رودارم