• 1400/08/17

جدا سازی ارقام در input در قسمت Razor Page :

سلام 

من با این تابع  ارقام رو سه رقم سه رقم جدا کردم ولی برای ذخیره  به مشکل خوردم ممنون میشم راهنمایی کنید.

 function itpro(Number)
            {
                Number+= '';
                Number= Number.replace(',', ''); 
                x = Number.split('.');
                y = x[0];
                z= x.length > 1 ? '.' + x[1] : '';
                var rgx = /(\d+)(\d{3})/;
                while (rgx.test(y))
                    y= y.replace(rgx, '$1' + ',' + '$2');
                return y+ z;
            }
  • 1400/08/18
  • ساعت 08:39

سلام دوست عزیز

اینکه دیگه واقعا یک نفر یه سوال رو درحالی که قبلا بهش جواب داده شده دوبار بپرسه واقعا برام عجیبه !!

اول سال یکبار این سوال رو پرسیدید و بهش جواب داده شد ! 

این لینک رو چک کنید.

موفق باشید


  • 1400/08/18
  • ساعت 15:19

آقای حمیدی عزیز اینم نتیجه اون  سوال بود که  جواب نگرفتم  با وارد کردن ارقام فقط سه رقم آخر رو جدا کرده و به ازای هر رقم یک ، قرار میده  قطعا جواب داده باشه سوال جدیدطرح نخواهد شد و قدردانی هم دارد اینطور نیست دوست من؟

 


  • 1400/08/19
  • ساعت 09:55

تا جایی که من تا الان از شما دیدم خیر همیشه اینطور نیست !! سوال های زیادی پرسیدین و دیگه هیچ پیگیری نکردید و هیچ جوابی ندادید ! زمانی که به هر دلیلی راهنمایی ها براتون جوابگو نیست بهتر نیست بجای جواب ندادن وطرح مجدد سوال بیاید و مشکل پیش اومده رو مجددا توی همون سوال مطرح کنید دوست عزیز ؟؟

قطعا یجای کار رو اشتباه رفتید یا جای اشتباهی اون رو استفاده کردید چون من بارها از این کد استفاده کردم، این هم نمونش : 

بهرحال مجددا راه حل رو خدمتتون عرض میکنم با مثال و توضیحات بیشتر ! همچنین یه مورد دیگه هم بهش اضافه میکنم برای اینکه کاربر نتونه توی اون فیلد مقدار غیر عددی وارد کنه.

1.یه فایل js مثلا با نام MyScripts بسازید و کدهای پایین رو توش کپی کنید :

function restrictInputToNumber(e) {
    var newValue = this.value.replace(new RegExp(/[^\d]/, 'ig'), "");
    this.value = newValue;
}

function digitSeperator(e) {
    var newValue = this.value.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
    this.value = newValue;
}

$(document).ready(function () {

   document.querySelectorAll('.numberOnly').forEach((input) => {
        input.addEventListener('input', restrictInputToNumber);
    });
    
    document.querySelectorAll('.digit-seperator').forEach((input) => {
        input.addEventListener('input', digitSeperator);
    });
   
});

2. حالا فایل MyScripts که ساختید رو توی Layout اصلی قبل از RenderBody باید Import کنید (درواقع توی تگ head مربوط به layout خودتون این فایل رو Import کنید) بعنوان مثال اینطوری :

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>@ViewBag.Title</title>

	<script src="~/Scripts/MyScripts.js"></script>

</head>
<body>

    <section>
        <div class="container-fluid">
            @RenderBody()
        </div>
    </section>

    @RenderSection("Scripts", required: false)

</body>
</html>

3.حالا کافیه به input های خودتون کلاس digit-seperator رو بدید تا ارقام رو 3 رقم 3 رقم جداکنه و کلاس numberOnly بدید تا فقط اجازه وارد کردن مقادیر عددی به کاربر بده، به اینصورت :

<input asp-for="DepositAmount" class="form-control numberOnly digit-seperator">

نکته 1 : کلاس numberOnly و digit-seperator فقط روی input ها کار میکنن

نکته 2 : کلاس numberOnly و digit-seperator بصورت جداگانه هم قابل استفاده هستند. مثلا توی فیلدی که قراره شماره موبایل وارد بشه باید تنها از کلاس numberOnly استفاده کنید

امیدوارم دیگه مشکلی نداشته باشید چون دیگه بیشتر از این توضیحی نمیشه داد! اگر بازهم توی ظاهرش مشکلی داشتید یا یک پروژه جدید ایجاد کنید و تست کنید یا اینکه یک صفحه جدید بسازید و Layout رو null کنید و فقط jquery و این فایل رو توش Import کنید، اگر مشکل حل شد که احتمالا یچیزی توی Layout استفاده کردید که داره اختلال ایجاد میکنه هم میتونه کد اسکریپتی باشه هم css که دیگه باید بگردید و مشکل رو پیدا کنید

موفق باشید


  • 1400/08/19
  • ساعت 10:10

سلام  آقای حمیدی عزیز 

داداش دمت گرم این  زمانی input نوع تکست میگیریم درست  نشون میده ولی مقدارش رو ولید نمیدونه که ثبت شه حتما باید تغییر بدیم؟

این تابع برای حذف کاما هاست؟کجا استفاده میشه؟

function restrictInputToNumber(e) {
    var newValue = this.value.replace(new RegExp(/[^\d]/, 'ig'), "");
    this.value = newValue;
}

 

 

 


  • 1400/08/19
  • ساعت 11:33

خب تغییر بدید و تست کنید ! نوعش رو text بزارید و توی ویو مدل هم از نوع string تعریف کنید، همونطور که نوشتم از کلاس numberOnly هم استفاده کنید تا کاربر نتونه مقدار غیر عددی وارد کنه، برای احتیاط سمت سرور هم مجددا Valid بودنش رو دستی چک کنید.

اسم فانکشن restrictInputToNumber هست که معنیش میشه "محدود کردن ورودی به عدد" ! از اسمش کاملا مشخصه کارش چیه و توضیح هم دادم چی هست و به چه دردی میخوره ! توضیحات رو با دقت بخونید و کدها رو دقیق نگاه کنید تا ببینید کجا و چطوری استفاده شده !


  • 1400/08/19
  • ساعت 12:29

آقای حمیدی ببینید من الان میخام توی جدول محصولات  محصول اضافه کنم  مقدار  مبلغ عددی هست در جدول باید اونو تغییر بدم؟

نحوه  ولید کردن مبلغی که با اسکریپت ها  سه رقم سه رقم جدا کردیم چطوری هست؟ میشه با کد توضیح بدید؟


  • 1400/08/19
  • ساعت 12:39

 

 

 

این فیلد مبلغ در جدول محصولات است:

     [Display(Name = "قیمت ")]
        [Required(ErrorMessage = "لطفا {0} را وارد کنید")]

        public int ProductPrice { get; set; }  

 

این input بخش مدیریت برای ورود مبلغ :

<div class="form-group row align-items-center m-b-0">
   <label class="col-3 text-right control-label col-form-label"> بازار</label>
        <div class="col-9 border-left p-b-10 p-t-10">
 			   <input type="text"  asp-for="Product.ProductPrice"   class="form-control 											numberOnly digit-seperator" placeholder="  قیمت را وارد کنید">
           </div>
                         
  </div>

 

 

 

 

 

 

 
        

  • 1400/08/19
  • ساعت 14:14

دوست عزیز چند بار توضیح بدم ! گفتم که فیلدتون رو بجای int به string تغییر بدید ! وقتی شما فیلدتون عددی هست اما مقدار رشته ای دارید وارد میکنید Valid نمیشه مگر اینکه یا مقدارتون بصورت عددی و بدون , باشه یا اینکه نوع فیلدتون رو از int به string تغییر بدید.

اشتباهی که کردید اینه که بجای اینکه از ViewModel استفاده کنید اومدید مستقیم از Entity خود جدولتون استفاده کردید واسه همین اگر بخواید نوعش رو عوض کنید باید یسری تغییرات هم توی کدهاتون بدید و یه migration بزنید که دیتابیس اصلاح بشه و  اگه اطلاعات داشته باشید باعث دردسرتون میشه. اگر از ViewModel استفاده کنید میتونید توی اون مقدار رو از نوع string تعریف کنید اما وقتی میخواید ثبتش کنید اون رو به int تبدیل کنید و ثبت کنید، اینطوری هم کارتون تمیز و استاندارد میشه هم نیازی به اصلاح دیتابیس و تغییر زیاد کدهاتون نیستید.


  • 1400/08/19
  • ساعت 15:11

من طبق آموزش استاد جلو رفتم با این توضیحی که شما داد یعنی استاد راه رو اشتباه داره یاد میده !!!


  • 1400/08/19
  • ساعت 21:02

ویو مدل برای افزودن محصولات:

public class AddProductViewModel
    {
       
        public string ProductPrice { get; set; }

       
    }

جدول محصولات :

  public class Product{
  
   public int ProductPrice { get; set; }
  }
  
  

 

متد افزودن در سرویس:

 int AddProduct(AddProductViewModel product, IFormFile imgProduct, IFormFile productDemo);

 

 public int AddProduct(AddProductViewModel product, IFormFile imgProduct, IFormFile productDemo)
        {
         

            var myProduct = new Product()
            {
                ProductId = product.ProductId,
                ProductPrice = Convert.ToInt32(product.ProductPrice),
               

        };

            //TODO Check Image
            if (imgProduct != null && imgProduct.IsImage())
            {
                product.ProductImageName = NameGenerator.GenerateUniqCode() + Path.GetExtension(imgProduct.FileName);
                var imagePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/Product/images",
                    product.ProductImageName);

                using (var stream = new FileStream(imagePath, FileMode.Create))
                {
                    imgProduct.CopyTo(stream);
                }

                var imageConvertor = new ImageConvertor();
                var thumbPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/Product/thumb",
                    product.ProductImageName);

                imageConvertor.Image_resize(imagePath, thumbPath, 250);
            }

            if (productDemo != null)
            {
                product.DemoFileName = NameGenerator.GenerateUniqCode() + Path.GetExtension(productDemo.FileName);
                var demoPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/Product/demoes",
                    product.DemoFileName);
                using var stream = new FileStream(demoPath, FileMode.Create);
                productDemo.CopyTo(stream);
            }

            _context.Add(myProduct);
            _context.SaveChanges();

            return myProduct.ProductId;
        }

 

خطا میده :

 


  • 1400/08/20
  • ساعت 11:12

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

با گذاشتن این کدها و این عکس چیزی مشخص نمیشه ! باید دیباگ کنید ببینید مشکلتون از کجاس، همون خط قرمز اول یعنی توی بدنه پروداکت یه مشکلی هست، تک تک آیتم هاش رو بررسی کنید مشکل پیدا میشه

این خط رو به اینصورت تعریف کنید ببینید روی کدوم یکی از آیتم ها خطا میده :

var myProduct = new Product();
myProduct.ProductId = product.ProductId;
myProduct.ProductPrice = Convert.ToInt32(product.ProductPrice), };
و ...

نکته ۱ : بررسی کنید اگر از سمت ویو به همراه مقدار ProductPrice اون , ها هم اومده اینجا اول با دستور replace اون کارکتر هارو حذف کنید بعد از دستور convert استفاده کنید

نکته ۲ : از اونجایی که ممکنه مبلغتون زیاد و یا حتی اعشاری باشه نوع فیلدتون رو از نوع int64 و یا decimal و یا double قرار بدید


  • 1400/08/20
  • ساعت 12:54

سلام داداش

خیلی خیلی ممنونم من با ویو مدل هم برای افزودن و ویرایش این  مشکل رو حل کردم به کمک دوست خوبم  جناب حمیدی عزیز 

فقط الان یه مشکل دارم در بخش ویرایش زمانی که محصول برای ویرایش انتخاب میشه اعداد رو به صورت سه رقم سه رقم جدا نمیکنه میشه  راهنمایی کنی؟


  • 1400/08/22
  • ساعت 08:38

خواهش میکنم

اگر Script هایی که گفتم رو درست و همونطوری که گفتم رفرنس داده باشید نباید مشکلی وجود داشته باشه، فقط کافیه توی هر صفحه ای به هر تگ input که میخواید 2 تا کلاس numberOnly و digit-seperator رو بدید

موفق باشید


logo-enamadlogo-samandehi