به نظرم اشتباهی شده، این خبر پایان پشتیبانی App Center از Cordova هست.
نظرات اشتراکها
window.localStorage window.sessionStorage
if(typeof(Storage) !== "undefined") { // Code for localStorage/sessionStorage. } else { // Sorry! No Web Storage support.. }
localStorage.setItem("lastname", "Smith"); //======================== localStorage.getItem("lastname");
var a=localStorage.lastname;
//ذخیره مقدار store.set('username', 'marcus') //بازیابی مقدار store.get('username') //حذف مقدار store.remove('username') //حذف تمامی مقادیر ذخیره شده store.clear() //ذخیره ساختار store.set('user', { name: 'marcus', likes: 'javascript' }) //بازیابی ساختار به شکل قبلی var user = store.get('user') alert(user.name + ' likes ' + user.likes) //تغییر مستقیم مقدار قبلی store.getAll().user.name == 'marcus' //بازخوانی تمام مقادیر ذخیر شده توسط یک حلقه store.forEach(function(key, val) { console.log(key, '==', val) })
<script src="store.min.js"></script> <script> init() function init() { if (!store.enabled) { alert('Local storage is not supported by your browser. Please disable "Private Mode", or upgrade to a modern browser.') return } var user = store.get('user') // ... and so on ... } </script>
var storeWithExpiration = { // دریافت کلید و مقدار و زمان انقضا به میلی ثانیه set: function(key, val, exp) { //ایجاد زمان فعلی جهت ثبت تاریخ ایجاد store.set(key, { val:val, exp:exp, time:new Date().getTime() }) }, get: function(key) { var info = store.get(key) //در صورتی که کلید داده شده مقداری نداشته باشد نال را بر میگردانیم if (!info) { return null } //تاریخ فعلی را منهای تاریخ ثبت شده کرده و در صورتی که //از مقدار میلی ثاینه بیشتر باشد یعنی منقضی شده و نال بر میگرداند if (new Date().getTime() - info.time > info.exp) { return null } return info.val } } // استفاده عملی از کد بالا // استفاده از تایمر جهت نمایش واکشی دادهها قبل از نقضا و بعد از انقضا storeWithExpiration.set('foo', 'bar', 1000) setTimeout(function() { console.log(storeWithExpiration.get('foo')) }, 500) // -> "bar" setTimeout(function() { console.log(storeWithExpiration.get('foo')) }, 1500) // -> null
CrossStorageHub.init([ {origin: /\.example.com$/, allow: ['get']}, {origin: /:\/\/(www\.)?example.com$/, allow: ['get', 'set', 'del']} ]);
valid.example.com
invalid.example.com.malicious.com
{ 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE', 'Access-Control-Allow-Headers': 'X-Requested-With', 'Content-Security-Policy': "default-src 'unsafe-inline' *", 'X-Content-Security-Policy': "default-src 'unsafe-inline' *", 'X-WebKit-CSP': "default-src 'unsafe-inline' *", }
<script type="text/javascript" src="~/Scripts/cross-storage/hub.js"></script> <script> CrossStorageHub.init([ {origin: /.*localhost:300\d$/, allow: ['get', 'set', 'del']} ]); </script>
var storage = new CrossStorageClient('http://localhost:3000/example/hub.html'); var setKeys = function () { return storage.set('key1', 'foo').then(function() { return storage.set('key2', 'bar'); }); };
storage.onConnect().then(function() { return storage.set('key', {foo: 'bar'}); }).then(function() { return storage.set('expiringKey', 'foobar', 10000); });
storage.onConnect().then(function() { return storage.get('key1'); }).then(function(res) { return storage.get('key1', 'key2', 'key3'); }).then(function(res) { // ... });
storage.onConnect() .then(function() { return storage.get('key1', 'key2'); }) .then(function(res) { console.log(res); // ['foo', 'bar'] })['catch'](function(err) { console.log(err); });
<script src="https://s3.amazonaws.com/es6-promises/promise-1.0.0.min.js"></script>
var request = indexedDB.open("library"); request.onupgradeneeded = function() { // The database did not previously exist, so create object stores and indexes. var db = request.result; var store = db.createObjectStore("books", {keyPath: "isbn"}); var titleIndex = store.createIndex("by_title", "title", {unique: true}); var authorIndex = store.createIndex("by_author", "author"); // Populate with initial data. store.put({title: "Quarry Memories", author: "Fred", isbn: 123456}); store.put({title: "Water Buffaloes", author: "Fred", isbn: 234567}); store.put({title: "Bedrock Nights", author: "Barney", isbn: 345678}); }; request.onsuccess = function() { db = request.result; };
var tx = db.transaction("books", "readwrite"); var store = tx.objectStore("books"); store.put({title: "Quarry Memories", author: "Fred", isbn: 123456}); store.put({title: "Water Buffaloes", author: "Fred", isbn: 234567}); store.put({title: "Bedrock Nights", author: "Barney", isbn: 345678}); tx.oncomplete = function() { // All requests have succeeded and the transaction has committed. };
var tx = db.transaction("books", "readonly"); var store = tx.objectStore("books"); var index = store.index("by_author"); var request = index.openCursor(IDBKeyRange.only("Fred")); request.onsuccess = function() { var cursor = request.result; if (cursor) { // Called for each matching record. report(cursor.value.isbn, cursor.value.title, cursor.value.author); cursor.continue(); } else { // No more matching records. report(null); } };
ساختار اطلاعاتی تصویر فوق به شرح زیر است:
<div> <div> <div> <p><span>First Name </span>: Jonathan</p> </div> </div> </div>
@model System.Web.UI.WebControls.ListItem <div> <p><span>@Model.Text </span>: @Model.Value</p> </div>
@using System.Web.UI.WebControls @using ZekrWepApp.Filters @model ZekrModel.Admin <div> <h1>Bio Graph</h1> <div> @{ ListItemCollection collection = GetCustomProperties.Get(Model,exclude:new string[]{"Poems","Id"}); foreach (var item in collection) { Html.RenderPartial(MVC.Shared.Views._BioRow, item); } } </div> </div>
public class GetCustomProperties { private static PropertyInfo[] getObjectsInfos(object obj,string[] inclue,string[] exclude ) { var list = obj.GetType().GetProperties(); PropertyInfo[] outputPropertyInfos = null; if (inclue != null) { return list.Where(propertyInfo => inclue.Contains(propertyInfo.Name)).ToArray(); } if (exclude != null) { return list.Where(propertyInfo => !exclude.Contains(propertyInfo.Name)).ToArray(); } return list; } }
public static ListItemCollection Get(object obj,string[] inclue=null,string[] exclude=null) { var propertyInfos = getObjectsInfos(obj, inclue, exclude); if (propertyInfos == null) throw new ArgumentNullException("propertyInfos is null"); var collection = new ListItemCollection(); foreach (PropertyInfo propertyInfo in propertyInfos) { string name = propertyInfo.Name; foreach (Attribute attribute in propertyInfo.GetCustomAttributes(true)) { DisplayAttribute displayAttribute = attribute as DisplayAttribute; if (displayAttribute != null) { name = displayAttribute.Name; break; } } string value = ""; object objvalue = propertyInfo.GetValue(obj); if (objvalue != null) value = objvalue.ToString(); collection.Add(new ListItem(name,value)); } return collection; }
[Display(Name = "نام کاربری")] public string UserName { get; set; }
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Web; using System.Web.Mvc.Html; using System.Web.UI.WebControls; using Links; namespace ZekrWepApp.Filters { public class GetCustomProperties { public static ListItemCollection Get(object obj,string[] inclue=null,string[] exclude=null) { var propertyInfos = getObjectsInfos(obj, inclue, exclude); if (propertyInfos == null) throw new ArgumentNullException("propertyInfos is null"); var collection = new ListItemCollection(); foreach (PropertyInfo propertyInfo in propertyInfos) { string name = propertyInfo.Name; foreach (Attribute attribute in propertyInfo.GetCustomAttributes(true)) { DisplayAttribute displayAttribute = attribute as DisplayAttribute; if (displayAttribute != null) { name = displayAttribute.Name; break; } } string value = ""; object objvalue = propertyInfo.GetValue(obj); if (objvalue != null) value = objvalue.ToString(); collection.Add(new ListItem(name,value)); } return collection; } private static PropertyInfo[] getObjectsInfos(object obj,string[] include,string[] exclude ) { var list = obj.GetType().GetProperties(); PropertyInfo[] outputPropertyInfos = null; if (include != null) { return list.Where(propertyInfo => include.Contains(propertyInfo.Name)).ToArray(); } if (exclude != null) { return list.Where(propertyInfo => !exclude.Contains(propertyInfo.Name)).ToArray(); } return list; } } }
amount=1000&orderId=452&Pid=xxx&....
using System; using System.Collections.Generic; using System.Linq; namespace Utils { public class QueryStringParametersList { private string Symbol = "&"; private List<KeyValuePair<string, string>> list { get; set; } public QueryStringParametersList() { list = new List<KeyValuePair<string, string>>(); } public QueryStringParametersList(string symbol) { Symbol = symbol; list = new List<KeyValuePair<string, string>>(); } public int Size { get { return list.Count; } } public void Add(string key, string value) { list.Add(new KeyValuePair<string, string>(key, value)); } public string GetQueryStringPostfix() { return string.Join(Symbol, list.Select(p => Uri.EscapeDataString(p.Key) + "=" + Uri.EscapeDataString(p.Value))); } } }
QueryStringParametersList queryparamsList = new QueryStringParametersList(); ueryparamsList.Add("consumer_key", requestPayment.Consumer_Key); queryparamsList.Add("amount", requestPayment.Amount.ToString()); queryparamsList.Add("callback", requestPayment.Callback); queryparamsList.Add("description", requestPayment.Description); queryparamsList.Add("email", requestPayment.Email); queryparamsList.Add("mobile", requestPayment.Mobile); queryparamsList.Add("name", requestPayment.Name); queryparamsList.Add("irderid", requestPayment.OrderId.ToString());
private QueryStringParametersList ReadParams(object obj) { PropertyInfo[] propertyInfos = obj.GetType().GetProperties(); QueryStringParametersList queryparamsList = new QueryStringParametersList(); for (int i = 0; i < propertyInfos.Count(); i++) { queryparamsList.Add(propertyInfos[i].Name.ToLower(),propertyInfos[i].GetValue(obj).ToString() ); } return queryparamsList; }
function testScope() { var myTest = true; if (true) { var myTest = "I am changed!" } alert(myTest); } testScope(); // will alert "I am changed!"
function testScope() { var myTest = true; if (true) { var myTest = "I am changed!" } alert(myTest); } testScope(); // will alert "I am changed!" alert(myTest); // will throw a reference error, because it doesn't exist outside of the function
<script type="text/javascript"> // a globally-scoped variable var a = 1; // global scope function one() { alert(a); } // local scope function two(a) { alert(a); } // local scope again function three() { var a = 3; alert(a); } // Intermediate: no such thing as block scope in javascript function four() { if (true) { var a = 4; } alert(a); // alerts '4', not the global value of '1' } // Intermediate: object properties function Five() { this.a = 5; } // Advanced: closure var six = function () { var foo = 6; return function () { // javascript "closure" means I have access to foo in here, // because it is defined in the function in which I was defined. alert(foo); } }() // Advanced: prototype-based scope resolution function Seven() { this.a = 7; } // [object].prototype.property loses to [object].property in the lookup chain Seven.prototype.a = -1; // won't get reached, because 'a' is set in the constructor above. Seven.prototype.b = 8; // Will get reached, even though 'b' is NOT set in the constructor. // These will print 1-8 one(); two(2); three(); four(); alert(new Five().a); six(); alert(new Seven().a); alert(new Seven().b); </Script>
var obj = { value: 0, increment: function() { this.value+=1; } }; obj.increment(); //Method invocation
<script type="text/javascript"> var value = 500; //Global variable var obj = { value: 0, increment: function() { this.value++; var innerFunction = function() { alert(this.value); } innerFunction(); //Function invocation pattern } } obj.increment(); //Method invocation pattern <script type="text/javascript"> Result : 500
<script type="text/javascript"> var value = 500; //Global variable var obj = { value: 0, increment: function() { var that = this; that.value++; var innerFunction = function() { alert(that.value); } innerFunction(); //Function invocation pattern } } obj.increment(); <script type="text/javascript"> Result : 1
var Dog = function(name) { //this == brand new object ({}); this.name = name; this.age = (Math.random() * 5) + 1; }; var myDog = new Dog('Spike'); //myDog.name == 'Spike' //myDog.age == 2 var yourDog = new Dog('Spot'); //yourDog.name == 'Spot' //yourDog.age == 4
var createCallBack = function(init) { //First function return new function() { //Second function by Constructor Invocation var that = this; this.message = init; return function() { //Third function alert(that.message); } } } window.addEventListener('load', createCallBack("First Message")); window.addEventListener('load', createCallBack("Second Message"));
myFunction.apply(thisContext, arrArgs); myFunction.call(thisContext, arg1, arg2, arg3, ..., argN);
var contextObject = { testContext: 10 } var otherContextObject = { testContext: "Hello World!" } var testContext = 15; // Global variable function testFunction() { alert(this.testContext); } testFunction(); // This will alert 15 testFunction.call(contextObject); // Will alert 10 testFunction.apply(otherContextObject); // Will alert "Hello World”
var o = { i : 0, F : function() { var a = function() { this.i = 42; }; a(); document.write(this.i); } }; o.F(); Result :0
var p = { i : 0, F : function() { var a = function() { this.i = 42; }; a.apply(this); document.write(this.i); } }; p.F(); Result :42
var q = { i: 0, F: function F() { var that = this; var a = function () { that.i = 42; } a(); document.write(this.i); } } q.F();
namespace jqGrid02.Models { public class Product { public int Id { set; get; } public string Name { set; get; } public decimal Price { set; get; } public Supplier Supplier { set; get; } } public class Supplier { public int Id { set; get; } public string CompanyName { set; get; } public string Address { set; get; } public string PostalCode { set; get; } public string City { set; get; } public string Country { set; get; } public string Phone { set; get; } public string HomePage { set; get; } } }
public ActionResult GetGetSupplierData(int id) { var list = ProductDataSource.LatestProducts; var product = list.FirstOrDefault(x => x.Id == id); if (product == null) return Json(null, JsonRequestBehavior.AllowGet); return Json(new { product.Supplier.CompanyName, product.Supplier.Address, product.Supplier.PostalCode, product.Supplier.City, product.Supplier.Country, product.Supplier.Phone, product.Supplier.HomePage }, JsonRequestBehavior.AllowGet); }
<div dir="rtl" id="supplierDialog"> <span id="CompanyName"></span><br /><br /> <span id="Address"></span><br /> <span id="PostalCode"></span>, <span id="City"></span><br /> <span id="Country"></span><br /><br /> <span id="Phone"></span><br /> <span id="HomePage"></span> </div>
<script type="text/javascript"> function showSupplierDialog(linkElement, supplierId) { //request json data $.getJSON('@Url.Action("GetGetSupplierData","Home")', { id: supplierId }, function (data) { //set values in dialog for (var property in data) { if (data.hasOwnProperty(property)) { $('#' + property).text(data[property]); } } //get link position var linkPosition = $(linkElement).offset(); $('#supplierDialog').dialog('option', 'position', [linkPosition.left, linkPosition.top]); //open dialog $('#supplierDialog').dialog('open'); }); } $(document).ready(function () { $('#supplierDialog').dialog({ autoOpen: false, bgiframe: true, resizable: false, title: 'تولید کننده' }); $('#list').jqGrid({ // .... مانند قبل colNames: ['شماره', 'نام محصول', 'قیمت'], //columns model colModel: [ { name: 'Id', index: 'Id', align: 'right', width: 20, formatter: function (cellvalue, options, rowObject) { var cellValueInt = parseInt(cellvalue); if (cellValueInt == 5) { return "<span style='background: brown; color: yellow'>" + cellvalue + "</span>"; } return cellvalue; } }, { name: 'Name', index: 'Name', align: 'right', width: 300, formatter: function (cellvalue, options, rowObject) { return "<a href='#' onclick='showSupplierDialog(this, " + rowObject[0] + ");'>" + cellvalue + "</a>"; } }, { name: 'Price', index: 'Price', align: 'center', width: 50, formatter: 'currency', formatoptions: { decimalSeparator: '.', thousandsSeparator: ',', decimalPlaces: 2, prefix: '$' } } ], // .... مانند قبل }); }); </script>
var model = { Title: "myTitle", Order: 2, IsActive: true, HtmlIcon: "<i className='someClass'><i>" } fetch("someUrl", { method: 'POST', body: JSON.stringify(model) }).then(response => { if (response.ok) { return response.json(); } else { throw new Error('Something went wrong'); } }).then(predicate => { console.log(predicate); }).catch(error => { console.log(error); });
[HttpPost] [Route (nameof (CreateAsync))] public ActionResult CreateAsync ([FromBody] test model) { // Some code }
public class ApplicationUser : IdentityUser { public string Email { get; set; } public string ConfirmationToken { get; set; } public bool IsConfirmed { get; set; } }
private string CreateConfirmationToken() { return ShortGuid.NewGuid(); } private void SendEmailConfirmation(string to, string username, string confirmationToken) { dynamic email = new Email("RegEmail"); email.To = to; email.UserName = username; email.ConfirmationToken = confirmationToken; email.Send(); } // // POST: /Account/Register [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { string confirmationToken = CreateConfirmationToken(); var user = new ApplicationUser() { UserName = model.UserName, Email = model.Email, ConfirmationToken = confirmationToken, IsConfirmed = false }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { SendEmailConfirmation(model.Email, model.UserName, confirmationToken); return RedirectToAction("RegisterStepTwo", "Account"); } else { AddErrors(result); } } // If we got this far, something failed, redisplay form return View(model); }
private bool ConfirmAccount(string confirmationToken) { ApplicationDbContext context = new ApplicationDbContext(); ApplicationUser user = context.Users.SingleOrDefault(u => u.ConfirmationToken == confirmationToken); if (user != null) { user.IsConfirmed = true; DbSet<ApplicationUser> dbSet = context.Set<ApplicationUser>(); dbSet.Attach(user); context.Entry(user).State = EntityState.Modified; context.SaveChanges(); return true; } return false; } [AllowAnonymous] public ActionResult RegisterConfirmation(string Id) { if (ConfirmAccount(Id)) { return RedirectToAction("ConfirmationSuccess"); } return RedirectToAction("ConfirmationFailure"); }
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { var user = await UserManager.FindAsync(model.UserName, model.Password); if (user != null && user.IsConfirmed) { await SignInAsync(user, model.RememberMe); return RedirectToLocal(returnUrl); } else { ModelState.AddModelError("", "Invalid username or password."); } } // If we got this far, something failed, redisplay form return View(model); }
To: @ViewBag.To From: YOURNAME@gmail.com Subject: Confirm your registration Hello @ViewBag.UserName, Please confirm your registration by following the link bellow. @Html.ActionLink(Url.Action("RegisterConfirmation", "Account", new { id = @ViewBag.ConfirmationToken }), "RegisterConfirmation", "Account", new { id = @ViewBag.ConfirmationToken }, null)
@{ Layout = null; /* Overrides the Layout set for regular page views. */ }
public static MvcHtmlString MenuLink(this HtmlHelper helper, string text, string action, string controller) { var routeData = helper.ViewContext.RouteData.Values; var currentController = routeData["controller"]; var currentAction = routeData["action"]; if(String.Equals(action, currentAction as string, StringComparison.OrdinalIgnoreCase) && String.Equals(controller, currentController as string, StringComparison.OrdinalIgnoreCase)) { return helper.ActionLink( text,action, controller, null, new { @class="currentMenuItem"} ); } return helper.ActionLink(text, action, controller); }
<li>@Html.MenuLink("Contact", "Contact", "Home")</li>
ul#menu li a { background: none; color: #999; padding: 5px; border-radius: 15px; text-decoration: none; } ul#menu li a.currentMenuItem { background-color: black; color: white; }
public static MvcHtmlString MenuLinkBootstrap(this HtmlHelper helper, string text, string action, string controller) { var routeData = helper.ViewContext.RouteData.Values; var currentController = routeData["controller"]; var currentAction = routeData["action"]; if (String.Equals(action, currentAction as string, StringComparison.OrdinalIgnoreCase) && String.Equals(controller, currentController as string, StringComparison.OrdinalIgnoreCase)) { return new MvcHtmlString("<li class=\"active\">" + helper.ActionLink(text, action, controller) + "</li>"); } return new MvcHtmlString("<li>" + helper.ActionLink(text, action, controller) + "</li>"); }
"Feature Toggling" is a set of patterns which can help a team to deliver new functionality to users rapidly but safely
public interface IFeatureToggle { bool FeatureEnabled {get;} }
class ShowMessageToggle : IFeatureToggle
{
public bool FeatureEnabled {
get{
return bool.Parse(ConfigurationManager.AppSettings["ShowMessageEnabled"]);
}
}
class Program { static void Main(string[] args) { var toggle = new ShowMessageToggle(); if (toggle.FeatureEnabled) { Console.WriteLine("This feature is enabled") } else { Console.WriteLine("This feature is disabled"); } } }
Install-Package FeatureToggle
MyAwesomeFeature : SimpleFeatureToggle {}
<add key="MyAwesomeFeature " value="true" />
if (!myAwesomeFeature.FeatureEnabled) { // code to disable stuff (e.g. UI buttons, etc) }
var result = await _onlinePayment.RequestAsync(Gateways.[Your Selected Gateway], [Tracking Number], [Amount], [Verify URL]);
using Parbad; protected void BtnPay_Click(object sender, EventArgs e) { // استفاده به صورت استاتیک و بدون تزریق وابستگی var result = StaticOnlinePayment.Instance.Request(Gateways.Mellat, 123, 25000, "http://www.mywebsite.com/foo/bar/"); if (result.IsSucceed) { // کاربر را به سمت درگاه بانکی هدایت میکند // همچنین بهتر است کد رهگیری که در شئ نتیجه است را، برای فاکتور مورد نظر در پایگاه داده خودتان ذخیره کنید result.GatewayTransporter.Transport(); } else { // درخواست پرداخت موفقیت آمیز نبود } }
using Parbad.Mvc5; private readonly IOnlinePayment _onlinePayment; // تزریق وابستگی به کنترلر public PaymentController(IOnlinePayment onlinePayment) { _onlinePayment = onlinePayment; } public async Task<ActionResult> Pay() { var result = await _onlinePayment.RequestAsync(Gateways.Mellat, 123, 25000, "http://www.mywebsite.com/foo/bar/"); if (result.IsSucceed) { // کاربر را به سمت درگاه بانکی هدایت میکند // همچنین بهتر است کد رهگیری که در شئ نتیجه است را، برای فاکتور مورد نظر در پایگاه داده خودتان ذخیره کنید return result.GatewayTransporter.TransportToGateway(); } else { // درخواست پرداخت موفقیت آمیز نبود } }
using Parbad.AspNetCore; private readonly IOnlinePayment _onlinePayment; public PaymentController(IOnlinePayment onlinePayment) { _onlinePayment = onlinePayment; } public async Task<IActionResult> Pay() { var result = await _onlinePayment.RequestAsync(Gateways.Mellat, 123, 25000, "http://www.mywebsite.com/foo/bar/"); if (result.IsSucceed) { // کاربر را به درگاه بانکی هدایت میکند // همچنین بهتر است کد رهگیری که در شئ نتیجه است را، برای فاکتور مورد نظر در پایگاه داده خودتان ذخیره کنید return result.GatewayTransporter.TransportToGateway(); } else { // do something else } }
public async Task<IActionResult> Verify() { var result = await _onlinePayment.VerifyAsync(invoice => { // در این مرحله هنوز درخواست واریز وجه از وب سایت شما به بانک ارسال نشده است // بنابراین شما میتوانید اطلاعات صورتحساب را با پایگاه داده خود چک کنید // و در صورت لزوم تراکنش را لغو کنید if (!Is_There_Still_Enough_SmartPhone_In_Shop(invoice.TrackingNumber)) { // لغو عملیات پرداخت invoice.CancelPayment("We have no more smart phones to sell."); } }); if(result.IsSucceed) { // پرداخت موفقیت آمیز بوده است. کد تراکنش بانکی را در پایگاه داده خود ذخیره کنید var transactionCode = result.TransactionCode; } else { // پرداخت به دلایلی موفقیت آمیز نبوده. // در صورت تمایل میتوانید پراپرتی پیام در شئ نتیجه را مشاهده کنید و یا به کاربر نمایش دهید } }
// کد رهگیری صورت حساب مورد نظر var trackingNumber = 123; var result = await _onlinePayment.RefundCompletelyAsync(trackingNumber);