بازخوردهای دوره
حذف یک ردیف از اطلاعات به همراه پویانمایی محو شدن اطلاعات آن توسط jQuery در ASP.NET MVC
البته راه دیگری هم پیدا کردم.
به نظرم جالب اومد.
ابتدا یک اکشن فیلتر تعریف شده و در ان هدر درخواست خوانده شده و با محتوی کوکی چک میشود در صورتی که برابر باشند عمل انجام خواهد شد با این تفاوت باید توکن در زمان ارسال در هدر درخواست قرار گیرد مانند زیر:
کد اکشن فیلتر:
سپس در اکشن دلخواه باید این اکشن فیلتر را بکار برد (در درخواستهای json)
سپس در طرف ویو به صورت زیر عمل شود
امیدوارم برای دوستان هم کاربرد داشته باشد
به نظرم جالب اومد.
ابتدا یک اکشن فیلتر تعریف شده و در ان هدر درخواست خوانده شده و با محتوی کوکی چک میشود در صورتی که برابر باشند عمل انجام خواهد شد با این تفاوت باید توکن در زمان ارسال در هدر درخواست قرار گیرد مانند زیر:
کد اکشن فیلتر:
public class ValidateJsonAntiForgeryTokenAttribute : ActionFilterAttribute { #region Methods (1) // Public Methods (1) /// <summary> /// Called when [action executing]. /// </summary> /// <param name="actionContext">The action context.</param> public void OnActionExecuting(HttpActionContext actionContext) { try { var cookieName = AntiForgeryConfig.CookieName; var headers = actionContext.Request.Headers; var cookie = headers .GetCookies() .Select(c => c[AntiForgeryConfig.CookieName]) .FirstOrDefault(); var rvt = headers.GetValues("__RequestVerificationToken").FirstOrDefault(); AntiForgery.Validate(cookie != null ? cookie.Value : null, rvt); } catch { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Unauthorized request."); } } #endregion Methods }
[HttpPost] //[ValidateAntiForgeryToken] [ValidateJsonAntiForgeryToken] [OutputCache(Location = OutputCacheLocation.None, NoStore = true)] public virtual ActionResult DeletePhoto(int? id) { string ret="error"; if (id != null && id > 0) { bool result = _imageGalleryService.Value.Photos.Value.Delete(id.ToInt32()); ret = result ? "ok" : "nok"; } return Content(ret); //return Json(new { ret }); }
$.ajax({ .... type: "POST", url: '@Url', data: JSON.stringify({ id: Id }), contentType: "application/json; charset=utf-8", // این قسمت اضافه شود headers: { __RequestVerificationToken: $("input[name=__RequestVerificationToken]").val() }, dataType: "json", ..........
نظرات اشتراکها
قالب ASP.NET Core و Angular 2 برای Visual Studio
با نصب این تمپلت فایل global.json رو نمیسازد و پروژه خطای localhost refused to connect را میدهد.
مگر بدون ایجاد فایل global.json و تنظیماتی مشابه زیر پروژه اجرا میشود؟
فقط پروژههای src /test بیلد میشود.
یک مشکل دیگری هم دارم. من این پروژه رو تونستم با کپی پیست کردن محتوای آن در پروژه جدیدی اجرا کنم. با تغییر صفحه، تمام فایلهای جاوااسکرپیتی و استایلها مجددا دانلود میشود! که مفهومه spa رو نقض میکند و عملا بدرد نمیخورد!
{ "projects": [ "src", "test" ], "sdk": { "version": "1.0.0-preview2-003121" } }
مشکل لود مجدد فایلهای جاوااسکریپت و استایلها با تغییر فایل index.cshtml برطرف گردید
@{ ViewData["Title"] = "Home Page"; } <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>@ViewData["Title"] - WebApplicationBasic</title> <link rel="stylesheet" href="ClientApp/dist/vendor.css" /> </head> <body> <app asp-prerender-module="ClientApp/dist/main-server">Loading...</app> @section scripts { <script src="~/ClientApp/dist/vendor.js"></script> <script src="~/ClientApp/dist/main-client.js"></script> } </body> </html>
یک نکتهی تکمیلی: سادهتر شدن به روز رسانی برنامهها در ASP.NET Core 6x
تا پیش از دات نت 6، فایلهای باینری برنامههای ASP.NET Core توسط IIS قفل میشوند و امکان جایگزینی آنها بدون متوقف کردن برنامه، میسر نیست. برای رفع این مشکل، پشتیبانی از shadow copy به ASP.NET Core Module for IIS جدید، اضافه شده که روش فعالسازی آن با انجام تغییراتی در Web.Config به صورت زیر است:
<?xml version="1.0" encoding="utf-8"?> <configuration> <!-- To customize the asp.net core module uncomment and edit the following section. For more info see https://go.microsoft.com/fwlink/?linkid=838655 --> <system.webServer> <handlers> <remove name="aspNetCore"/> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModulev2" resourceType="Unspecified"/> </handlers> <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout"> <handlerSettings> <handlerSetting name="experimentalEnableShadowCopy" value="true" /> <handlerSetting name="shadowCopyDirectory" value="../ShadowCopyDirectory/" /> <!-- Only enable handler logging if you encounter issues--> <!--<handlerSetting name="debugFile" value=".\logs\aspnetcore-debug.log" />--> <!--<handlerSetting name="debugLevel" value="FILE,TRACE" />--> </handlerSettings> </aspNetCore> </system.webServer> </configuration>
نظرات مطالب
فعال سازی عملیات CRUD در Kendo UI Grid
در مثال دات نت کور این مساله در بخش Sample2 داخل کنترلر دو پارامتر رو(string param1, string param2) ذکر کردین که تو View همون کنترلر اشاره شده که میشه ارسال اطلاعات اضافی کرد به سمت سرور توسط این بخش ارسال اطلاعات اضافی و سفارشی به سرور در حین درخواست . ولی من میخوام یه ای دی از نوع int رو این شکلی ارسال کنم ولی هر بار که چک میکنم نال میفرسته داخل کنترلر.
این متد برای kendo grid بخش read هستش داخل کنترلر :
public IActionResult CurrentPostTags(int blogID) { var dataString = this.HttpContext.GetJsonDataFromQueryString(); var request = JsonConvert.DeserializeObject<DataSourceRequest>(dataString); var tags = _blogRepository.GetAllTags(blogID).OrderBy(s => s.Id); var currenttags = _mapper.Map<IList<TagsViewModel>>(tags); if (currenttags == null) { return NotFound(); } return Json(currenttags.AsQueryable() .ToDataSourceResult(request.Take, request.Skip, request.Sort, request.Filter)); }
که میخوام blogID رو دریافت کنم از سمت کندو گرید ولی نال میگیره هر بار. حتی یه رشته هم میفرستم باز نال برمیگردونه.
اینم گرید بنده :
$(function() { var currentTagsDataSource = new kendo.data.DataSource({ transport: { read: { url: "@Url.Action("CurrentPostTags", "Admin")", dataType: "json", contentType: 'application/json; charset=utf-8', type: 'GET', data : { blogID: @BlogID } },
نظرات مطالب
فعال سازی عملیات CRUD در Kendo UI Grid
سلام؛ هنگام حذف یک سطر با پیغام 400 یا همان BadRequest مواجه میشم و عجیب اینکه type رو بصورت xml نشون میده داخل delete به جای json تو بخش Network یعنی عکس دوم (یک لحظه اون سطر از داخل سطرها حذف میشه به محض رفرش کردن گرید دوباره نشون میده):
اینم کدهای بنده داخل View متناظر:
destroy: { url: function (blog) { return "@Url.Action("DeleteBlog","Admin")/" + blog.id; }, contentType: 'application/json; charset=utf-8', type: "DELETE" },
و این بخش :
$("#report-grid").kendoGrid({ dataSource: blogDataSource, autoBind: true, scrollable: false, pageable: true, sortable: true, filterable: true, reorderable: true, selectable: true, editable: { confirmation: "آیا مایل به حذف ردیف انتخابی هستید؟", destroy: true, // whether or not to delete item when button is clicked mode: "popup" // options are "incell", "inline", and "popup"
اینم کدهای اکشن متد Delete بنده :
[HttpDelete] [ValidateAntiForgeryToken] public async Task<IActionResult> DeleteBlog(long id) { var blog = _blogRepository.Get(id); if (blog == null) return NotFound(); blog.IsDeleted = true; _blogRepository.Update(blog); await _unitOfWork.SaveAsync(); return Json(blog); }
یک نکتهی تکمیلی: Binding موارد پیش بینی نشده در الگوی MVVM
اگر در پروژهی xamarin forms، با استفاده از الگوی mvvm خواستید پارامتری را به المانهای کنترلی در صفحه مقید کنید که امکان آن از قبل فراهم نشده است، میتوان با استفاده از سفارشی سازی کلاس کنترل، این مشکل را مرتفع کرد. در مثال زیر سعی شده پارامتر Link را در ViewModel که بصورت رشته است، به کنترل WebView مقید کرد. البته باید در نظر داشت که کنترلر از BindableObject ارث بری کرده باشد تا بتوان از متدهای مرتبط با BindableProperty در کلاس جدید استفاده کرد. نام متغیر ساخته شده از کلاس BindableProperty، دقیقا باید ترکیبی از نام شیء به اضافه Property در آخر باشد که به آن مقید شده است. مثلا برای Uri باید
از نام UriProperty استفاده کرد.
چون در زمان مقید کردن Uri={Binding Link} کامپایلر به متغیر UriProperty نگاشت میکند و در زمان تخصیص مستقیم تنها شیء Uri در کلاس MyWebView مقدار دهی میشود.
public class MyWebView : WebView { public static readonly BindableProperty UriProperty = BindableProperty.Create(nameof(Uri), typeof(string), typeof(MyWebView), null, propertyChanged: OnItemSourceChanged); public string Uri { get { return (string)GetValue(UriProperty); } set { SetValue(UriProperty, value); } } public static void OnItemSourceChanged(BindableObject bindable, object oldValue, object newValue) { ((MyWebView)bindable).OnItemSourceChanged((string)oldValue, (string)newValue); } public void OnItemSourceChanged(string oldValue, string newValue) { Source = newValue; } }
<?xml version="1.0" encoding="utf-8" ?> <ContentPage ... xmlns:tools="clr-namespace:..."
> <ContentPage.Content> .... <tools:MyWebView Uri="{Binding Link}" /> .... </ContentPage.Content> </ContentPage>
نظرات مطالب
LocalDB چیست؟
در کد زیر اگر کانکشن استرینگ را کامنت کنم بانک ساخته میشود و مشکلی ندارد در غیر این صورت پیغام خطای زیر را میدهد:
فایل app.config :
A file activation error occurred. The physical file name 'tax.mdf' may be incorrect. Diagnose and correct additional errors, and retry the operation. CREATE DATABASE failed. Some file names listed could not be created. Check related errors.
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections> <connectionStrings> <clear/> <add name="Context" connectionString="Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True; AttachDBFilename=tax.mdf" providerName="System.Data.SqlClient" /> </connectionStrings> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters > <parameter value="v11.0"/> </parameters> </defaultConnectionFactory> </entityFramework> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup></configuration>
نظرات مطالب
ASP.NET MVC #21
با سلام.
علت اینکه پارامتر ids مربوط به اکشن delete همواره null میگیرد چیست؟
@{ var postUrl = Url.Action(actionName: "Delete", controllerName: "Student"); } <div class="deleteDialog"> <div> آیتمهای انتخاب شده حذف خواهند شد. آیا تأیید میکنید؟ </div> <p> <input type="submit" id="btn_SubmitDelete" value="حذف" /> <input type="submit" id="btn_CancelDelete" value="انصراف" /> </p> </div> <script type="text/javascript"> $(function () { $("#btn_SubmitDelete").click(function (e) { var button = $(this); e.preventDefault(); var data = "1,3,8,9"; $.ajax({ type: "POST", url: "@postUrl", data: JSON.stringify({ ids: data}), contentType: "application/json; charset=utf-8", dataType: 'json', cache: false, beforeSend: function () { }, success: function (html) { alert(html); $(".deleteDialog").parent("div").css("display", "none"); }, complete: function () { button.removeAttr('disabled'); button.val("حذف"); } }); }); $("#btn_CancelDelete").click(function (e) { e.preventDefault(); var button = $(this); $(".deleteDialog").parent("div").css("display", "none"); }); }); </script>
[HttpGet] public ActionResult Delete() { return PartialView("Pv_Delete"); } [HttpPost] [AjaxOnly] public ActionResult Delete(string ids) { var allIds = ids.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList(); Thread.Sleep(2000); if (true) { return Json(new { result = "ok" }, JsonRequestBehavior.AllowGet); } return Json(new { result = "error" }); }
تا جایی که من مطلع هستم از طریق تنظیمات IIS میتوان پاسخ به درخواستها را (شامل فایلهای استاتیک و داینامیک) به کمک gzip فشرده کرد. اما اگر اطلاعاتم صحیح باشد این موضوع کمی بار CPU را افزایش میدهد، هر چند گاهی تا 75% حجم اطلاعات رد و بدل شده را کاهش میدهد.
برای اطلاعات بیشتر در مورد تنظیمات IIS6 میتوانید به + و + مراجعه کنید.
همچنین اگر روی IIS7 به بعد میزبانی میشوید میتوانید درون فایل Web.Config و درون تگ system.webServer تنظیمات زیر را اضافه کنید:
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files"> <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" dynamicCompressionLevel="4" /> <scheme name="deflate" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" dynamicCompressionLevel="4" /> <dynamicTypes> <add mimeType="text/*" enabled="true" /> <add mimeType="message/*" enabled="true" /> <add mimeType="application/x-javascript" enabled="true" /> <add mimeType="application/atom+xml; charset=utf-8" enabled="true" /> <add mimeType="*/*" enabled="false" /> </dynamicTypes> <staticTypes> <add mimeType="text/*" enabled="true" /> <add mimeType="message/*" enabled="true" /> <add mimeType="application/javascript" enabled="true" /> <add mimeType="*/*" enabled="false" /> </staticTypes> </httpCompression>
(برای مطالعه بیشتر این + را ببینید.)