«... همانطور که از نام ValueTask نیز مشخص است، یک struct است؛ برخلاف Task ... »
انتخاب نام Value در اینجا، به value types در دات نت اشاره میکند؛ اطلاعات بیشتر:
public class User { public string UserName { get; set; } public bool IsRole { get; set; } public HashSet<string> ConnectionIds { get; set; } } [Authorize] [HubName("userActivityHub")] public class UserActivityHub : Hub { private static readonly ConcurrentDictionary<string, User> Users = new ConcurrentDictionary<string, User>(); public void AdminJoin() { Groups.Add(Context.ConnectionId, "admins"); } public void Join() { var userName = Context.User.Identity.Name; var connectionId = Context.ConnectionId; var isAdmin = Context.User.IsInRole("Admin"); var user = Users.GetOrAdd(userName, _ => new User { UserName = userName, IsRole = isAdmin, ConnectionIds = new HashSet<string>() }); if (user.IsRole == true) { Groups.Add(user.ConnectionIds.ToString(), "admins"); } else { lock (user.ConnectionIds) { user.ConnectionIds.Add(connectionId); } Clients.Group("admins").showUserCount(Users.Count(a => a.Value.IsRole != true)); } } public void GetUserCount() { Clients.Group("admins").showUserCount(Users.Count(a => a.Value.IsRole != true)); } public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled) { if (stopCalled) { var userName = Context.User.Identity.Name; var connectionId = Context.ConnectionId; User user; Users.TryGetValue(userName, out user); if (user != null) { lock (user.ConnectionIds) { user.ConnectionIds.RemoveWhere(cid => cid.Equals(connectionId)); if (!user.ConnectionIds.Any()) { User removeUser; Users.TryRemove(userName, out removeUser); } } } return Clients.Group("admins").showUserCount(Users.Count(a => a.Value.IsRole != true)); } else { return base.OnDisconnected(false); } } }
<script type="text/javascript"> var userHub = $.connection.userActivityHub; $.connection.hub.logging = true; $.connection.hub.start().done(function() { userHub.server.join(); }); $(function() { window.onbeforeunload = function() { $.connection.hub.stop(); }; }); </script>
<script type="text/javascript"> var userHub = $.connection.userActivityHub; userHub.client.showUserCount = function (message) { $('#userOnlineCount').html(message); }; $.connection.hub.start().done(function() { userHub.server.adminJoin().done(function() { userHub.server.getUserCount(); }); }); </script>
<script> $('a.btn.btn-danger.btn-block').click(function(e) { e.preventDefault(); $('#logoutForm').submit(); $.connection.userActivityHub.connection.stop(); }); $(function() { window.onbeforeunload = function(e) { $.connection.hub.stop(); }; }); </script>
<option value="value">Name</option>
.attr("value", data[i].Id).text(data[i].Title)
<option value="100">AmirHossein</option>
npm install moment-jalaali --save
node_modules/moment/min/moment.min.js node_modules/moment-jalaali/build/moment-jalaali.js
Install-Package MD.BootstrapPersianDateTimePicker
<link href="~/css/site.min.css" rel="stylesheet" asp-append-version="true" /> <script src="~/js/site.min.js" type="text/javascript" asp-append-version="true"></script>
{ field: "addDate", title: "تاریخ ثبت", template: "#=moment(addDate).format('jYYYY/jMM/jDD')#",
editor: function(container, options) { }
// دریافت تاریخ میلادی و تبدیل آن به شمسی جهت نمایش در تکست باکس var persianAddDate = moment(options.model.addDate).format('jYYYY/jMM/jDD'); // ایجاد کنترل انتخاب تاریخ سفارشی با مقدار تاریخ شمسی دریف جاری var input = $('<div dir="ltr" class="input-group">'+ '<div class="input-group-addon" data-name="datepicker1" data-mddatetimepicker="true" data-trigger="click" data-targetselector="#' + options.field + '" data-fromdate="false" data-enabletimepicker="false" data-englishnumber="true" data-placement="left">'+ '<span class="glyphicon glyphicon-calendar"></span>'+ '</div>'+ '<input type="text" value="'+ persianAddDate +'" class="form-control" id="' + options.field + '" placeholder="از تاریخ" data-mddatetimepicker="true" data-trigger="click" data-targetselector="#' + options.field + '" data-englishnumber="true" data-fromdate="true" data-enabletimepicker="false" data-placement="right" />'+ '</div>'); // افزودن کنترل جدید به صفحه input.appendTo(container);
// با خبر سازی کتابخانه انتخاب تاریخ از تکست باکس جدید EnableMdDateTimePickers();
// هر زمانیکه کاربر تاریخ جدیدی را وارد کرد، آنرا به میلادی تبدیل کرده و در مدل ردیف جاری ثبت میکنیم // در نهایت این مقدار میلادی است که به سمت سرور ارسال خواهد شد $('#' + options.field).change(function(){ var selectedPersianDate = $(this)[0].value; var gregorianAddDate = moment(selectedPersianDate, 'jYYYY/jMM/jDD').format('YYYY-MM-DD'); options.model.set('addDate', gregorianAddDate); });
// با از دست رفتن فوکوس نیاز است این کنترل مخفی شود $('#' + options.field).blur(function(){ $('[data-name="datepicker1"]').MdPersianDateTimePicker('hide'); });
<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js' type='text/javascript' />
<script type="text/javascript">
$(document).ready(function(){
$("a").each(function(){
var $a = $(this);
var href = $a.attr("href");
// see if the link is external
if (href && href.match(/^http/))
if (!href.match(document.domain)) {
var domain = href.replace(/<\S[^><]*>/g, "").split('/')[2];
var image = '<img src="http://' + domain +
'/favicon.ico" width="0" ' +
' onload="this.width=16;this.height=16;this.style.paddingLeft=\'3px\';this.style.paddingRight=\'1px\';" ' +
' style="border:0" ' +
' onerror="this.src=\'http://vahid.nasiri.googlepages.com/weblink.gif\';" />';
$(this).prepend(image);
}
});
});
</script>
Config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{Controller}/{id}", defaults: new { id = RouteParameter.Optional } );
URI Pattern --> books/1/authors [Route("books/{bookId}/authors")] public IEnumerable<Author> GetAuthorByBook(int bookId) { ..... }
OWIN یک اینترفیس استاندارد بین سرورهای دات نت و اپلیکیشنهای وب تعریف میکند. هدف این اینترفیس جداسازی (decoupling) سرور و اپلیکیشن است. تشویق به توسعه ماژولهای ساده برای توسعه اپلیکیشنهای وب دات نت. و بعنوان یک استاندارد باز (open standard) اکوسیستم نرم افزارهای متن باز را تحریک کند تا ابزار توسعه اپلیکیشنهای وب دات نت توسعه یابند.
<input type="file" multiple="multiple" name="File1" id="File1" runat="server" />
for (int i = 1; i <= Request.Files.Count; i++) { var file = Request.Files[i]; }
public ActionResult Style() { Response.ContentType = "text/css"; var model = new Style { Color = "red", Background = "blue" }; return View(model); }
@model ExternalJavaScript.Models.Style @{ Layout = null; } body { color : @Model.Color; background-color : @Model.Background; }
<link rel="stylesheet" href="@Url.Action("Style","Home")" />
public class ContentType : ActionFilterAttribute { private string _contentType; public ContentType(string ct) { this._contentType = ct; } public override void OnActionExecuted(ActionExecutedContext context) { /* nada */ } public override void OnActionExecuting(ActionExecutingContext context) { context.HttpContext.Response.ContentType = this._contentType; } }
[ContentType("text/css")] public ActionResult Style() { var model = new Style { Color = "red", Background = "blue" }; return View(model); }
public class JavaScriptSettingsController : Controller { public ActionResult Index() { return PartialView(); } }
$(function(){ $.post('@Url.Action("GetData", "Home")', function (data) { $('.notificationList').html(data); if ($(data).filter("li").length != 0) { $('#notificationCounter').html($(data).filter("li").length); } }); });
<script src="/JavaScriptSettings"></script>
<script> $(function () { $.post('@Url.Action("Index", "Home")', function (data) { $('.notificationList').html(data); if ($(data).filter("li").length != 0) { $('#notificationCounter').html($(data).filter("li").length); } }); }); </script>
public class ExternalFileAttribute : ActionFilterAttribute { private readonly string _contentType; private readonly string _tag; public ExternalFileAttribute(string ct, string tag) { this._contentType = ct; _tag = tag; } public override void OnResultExecuted(ResultExecutedContext filterContext) { var response = filterContext.HttpContext.Response; response.Filter = new StripEnclosingTagsFilter(response.Filter, _tag); response.ContentType = _contentType; } private class StripEnclosingTagsFilter : MemoryStream { private static Regex _leadingOpeningScriptTag; private static Regex _trailingClosingScriptTag; //private static string Tag; private readonly StringBuilder _output; private readonly Stream _responseStream; /*static StripEnclosingTagsFilter() { LeadingOpeningScriptTag = new Regex(string.Format(@"^\s*<{0}[^>]*>", Tag), RegexOptions.Compiled); TrailingClosingScriptTag = new Regex(string.Format(@"</{0}>\s*$", Tag), RegexOptions.Compiled); }*/ public StripEnclosingTagsFilter(Stream responseStream, string tag) { _leadingOpeningScriptTag = new Regex(string.Format(@"^\s*<{0}[^>]*>", tag), RegexOptions.Compiled); _trailingClosingScriptTag = new Regex(string.Format(@"</{0}>\s*$", tag), RegexOptions.Compiled); _responseStream = responseStream; _output = new StringBuilder(); } public override void Write(byte[] buffer, int offset, int count) { string response = GetStringResponse(buffer, offset, count); _output.Append(response); } public override void Flush() { string response = _output.ToString(); if (_leadingOpeningScriptTag.IsMatch(response) && _trailingClosingScriptTag.IsMatch(response)) { response = _leadingOpeningScriptTag.Replace(response, string.Empty); response = _trailingClosingScriptTag.Replace(response, string.Empty); } WriteStringResponse(response); _output.Clear(); } private static string GetStringResponse(byte[] buffer, int offset, int count) { byte[] responseData = new byte[count]; Buffer.BlockCopy(buffer, offset, responseData, 0, count); return Encoding.Default.GetString(responseData); } private void WriteStringResponse(string response) { byte[] outdata = Encoding.Default.GetBytes(response); _responseStream.Write(outdata, 0, outdata.GetLength(0)); } } }
[ExternalFile("text/javascript", "script")] public ActionResult Index() { return PartialView(); }
[ExternalFile("text/css", "style")] public ActionResult Style() { var model = new Style { Color = "red", Background = "blue" }; return View(model); }
<!DOCTYPE html> <html> <head> <script src="./jquery.min.js"></script> <meta charset="utf-8"> <title></title> <script> $(document).ready(()=> { alert("Welcome"); }); </script> </head> <body> </body> </html>
win.openDevTools();
exports.sayHelloInEnglish=()=> { console.log("hello"); } exports.sayHelloInPersian=()=> { console.log('salam'); }
const test=require("./test.js"); test.sayHelloInPersian(); test.sayHelloInEnglish();
if ( typeof module === "object" && typeof module.exports === "object" ) { // set jQuery in `module` } else { // set jQuery in `window` }
<script src="./jquery.min.js"></script> <script> window.$=window.jQuery=module.exports; </script>
window.$ = window.jQuery = require('./jquery.min.js');
using System;
using System.Collections.Generic;
using Google.GData.Client;
namespace BloggerAutoPoster
{
public class BloggerAutoPoster
{
public string UserName { set; get; }
public string Password { set; get; }
public string PostTitle { set; get; }
public IList<string> PostTags { set; get; }
public string PostBody { set; get; }
public string BlogUrl { set; get; }
public bool PostAsDraft { set; get; }
public bool PostNewEntry()
{
var service = new Service("blogger", "blogger-example")
{
Credentials = new GDataCredentials(UserName, Password)
};
var newPost = constructNewEntry();
var result = service.Insert(new Uri(BlogUrl), newPost);
return result != null;
}
private AtomEntry constructNewEntry()
{
var newPost = new AtomEntry
{
Title = { Text = PostTitle },
Content = new AtomContent
{
Content = string.Format(@"<div xmlns=""http://www.w3.org/1999/xhtml"">{0}</div>", PostBody),
Type = "xhtml"
},
IsDraft = PostAsDraft
};
foreach (var tag in PostTags)
{
newPost.Categories.Add(
new AtomCategory
{
Term = tag,
Scheme = "http://www.blogger.com/atom/ns#"
});
}
return newPost;
}
}
}
new BloggerAutoPoster
{
BlogUrl = "https://www.blogger.com/feeds/number/posts/default",
UserName = "name@gmail.com",
Password = "pass",
PostTitle = "بررسی ارسل خودکار-3",
PostTags = new List<string> { "بررسی ارسال خودکار" },
PostBody = "تست میشود123",
PostAsDraft = false
}.PostNewEntry();
using System;
using System.Collections.Generic;
using System.Linq;
using Google.GData.Client;
namespace BloggerAutoPoster
{
public class BlogInfo
{
public string Title { set; get; }
public string Url { set; get; }
}
public class BloggerInfo
{
public static IList<BlogInfo> FindMyBlogsUrls(string username, string password)
{
var result = new List<BlogInfo>();
var service = new Service("blogger", "blogger-example")
{
Credentials = new GDataCredentials(username, password)
};
var query = new FeedQuery { Uri = new Uri("https://www.blogger.com/feeds/default/blogs") };
var feed = service.Query(query);
if (feed == null)
throw new NotSupportedException("You don't have any blogs!");
foreach (var entry in feed.Entries)
{
result.AddRange(entry.Links.Where(t => t.Rel.Equals("http://schemas.google.com/g/2005#post"))
.Select(t => new BlogInfo
{
Url = new Uri(t.HRef.ToString()).AbsoluteUri,
Title = entry.Title.Text
}));
}
return result;
}
}
}