mozhgan_pkdl
جمعه 21 مهر 1396, 00:53 صبح
سلام  به همه
من میخواستم تو یه کنترلر از فیلتر ajaxonly استفاده کنم به این صورت :
[ajaxonly]
با توجه به آموزش های توی نت نتونستم کاری کنم و همه ی کد ها ارور میداد لطفا اگر کسی بلده راهنماییم کنه
Moien Tajik
جمعه 21 مهر 1396, 13:12 عصر
AjaxOnly در سطح اکشن قابل استفاده هستش و باید بالای Action قرار بگیره.
 ساختار درونش به این شکل هست که از HttpContext.Request.IsAjaxRequest برای تشخیص Ajax بودن Request استفاده میکنه :
public class AjaxOnlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.Request.IsAjaxRequest( ))
        {
            filterContext.Result = new HttpNotFoundResult();
        }
    }
}
اگر اروری دارید ، متن ارور رو قرار بدید .
ali_md110
جمعه 21 مهر 1396, 20:45 عصر
جهت تکمیل راهنمایی دوستون جناب تاجیک
فرض کنیم میخایم اطلاعات یک شخص رو ثبت کنیم
فرم مورد نظر مون بدین شکل طراحی میکنیم
<div class="panel-body">
    @using (Html.BeginForm("CreatePersonnel","Person", FormMethod.Post,
        new {@class = "form-horizontal", id = "personForm"}))
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(false, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(m => m.PersonnelViewModel.FirstName, new { @class = "control-label col-md-2 col-lg-2 ", @for = "FirstName" })
            <div class="col-md-8 col-lg-8">
                @Html.TextBoxFor(m => m.PersonnelViewModel.FirstName, new { @class = "form-control",id= "FirstName" })
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(m => m.PersonnelViewModel.LastName, new { @class = "control-label col-md-2 col-lg-2", @for = "LastName" })
            <div class="col-md-8 col-lg-8">
                @Html.TextBoxFor(m => m.PersonnelViewModel.LastName, new { @class = "form-control", id = "LastName" })
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(m => m.PersonnelViewModel.PersonnelCode, new { @class = "control-label col-md-2 col-lg-2", @for = "PersonnelCode" })
            <div class="col-md-8 col-lg-8">
                @Html.TextBoxFor(m => m.PersonnelViewModel.PersonnelCode, new { @class = "form-control",id= "PersonnelCode" })
            </div>
        </div>
         <div class="form-group">
                 
            <button type="button" id="save" style="width: 30%" name="submit" class="btn btn-success col-md-offset-4">
                <i class="fa fa-save"></i> ثبت در سیستم
            </button>
                   
        </div>
           
    }
</div>
برای ثبت اطلاعات فرم هم یک متد بنویسید بدینصورت
<script>
    $(document).ready(function ()
    {
        $("#save").click(function (e) {
            e.preventDefault();
            var button = $("#save");
            var $form = $("#personForm");
            var validator = $form.data('validator');
            validator.settings.ignore = ':hidden:not(".multiselect")';
            validator.settings.ignore = ":hidden:not(select)";
            var validateForm = function (form) {
                //فعال سازي دستي اعتبار سنجي جيكوئري
                var val = form.validate();
                val.form();
                return val.valid();
            };
            //اگر فرم اعتبار سنجي نشده، اطلاعات آن ارسال نشود
            if (!validateForm($form)) return;
            //برای چلوگیری از دوبار کلیک شدن دکمه ثبت
            button.attr('disabled', 'disabled');
            button.val("لطفا صبر کنید");
            $.ajax({
                url: '@Url.Action("CreatePersonnel", "Person")',
                type: "POST",
                data: $form.serialize(), //تمام فيلدهاي فرم منجمله آنتي فرجري توكن آنرا ارسال ميكند
              
                cache: false,
                complete: function (xhr, status) {
                    var data = xhr.responseText;
                    if (xhr.status == 403) {
                        window.location = options.loginUrl; //در حالت لاگين نبودن شخص اجرا ميشود
                    }
                    else if (status === 'error' || !data)
                    {
                        $.each(data, function (idx, errorMessage) {
                            alert(errorMessage);
                            
                        });
                    }
                    else {
                        //دکمه ثبت به حالت اول خود بر میگردد و فعال میشود
                        button.removeAttr('disabled');
                        button.val("ثبت در سیستم");
                        //غیر فعال شدن ولیدیشن پس از ثبت
                        $('.validation-summary-errors').addClass('validation-summary-valid');
                        $('.validation-summary-errors').removeClass('validation-summary-errors');
                    }
                },
                success: function (data)
                {
                    if (data.IsSuccess)
                    {
                      
                        $('#personForm')[0].reset();
                       
                        alert('ثبت اطلاعات با موفقیت انجام شد!');
                      
                    }
                    else
                    {
                        if (data.errors != null)
                        {
                            // show model state error
                            $.each(data.errors, function (idx, errorMessage)
                            {
                                alert(errorMessage);
                                
                            });
                            
                        }
                    }
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    alert(thrownError + " " + xhr.status);
                  
                }
            });
        });
    });
</script>
این هم کدهای کنترلر برنامه
 [HttpGet]
        public virtual ActionResult CreatePersonnel()
        {
            var model = new AddPersonelViewModel () ;
           
            return View(model);
        }
        [HttpPost]
        [AjaxOnly] //فقط در حالت ايجكس قابل دسترسي باشد
        [ValidateAntiForgeryToken]
        public virtual async Task<ActionResult> CreatePersonnel(AddPersonelViewModel model)
        {
          
            if (!ModelState.IsValid)
            {
                return Content("خطاهای برنامه بررسی کنید");
            }
            
            var data = new Personnel
            {
             
               
                FirstName = model.PersonnelViewModel.FirstName,
                LastName = model.PersonnelViewModel.LastName,
                FullName=model.PersonnelViewModel.FirstName+" "+model.PersonnelViewModel.LastName,
               .....
            };
            _accountService.Value.AddPersonnel(data);
           
            
            await SaveAllChangesAsync();//ذخیره در دیتابیس
          
            
            return new JsonResult
            {
                Data = new
                {
IsSuccess=true;
                    errors = ModelState.Keys.SelectMany(k => ModelState[k].Errors).Select(x => x.ErrorMessage).ToArray(),
                    
                    message="ثبت با موفقیت"
                },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
               
            };
        }
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.