PDA

View Full Version : سوال: چگونه فیلتر ajaxonly رو اعمال کنم؟؟؟



mozhgan_pkdl
پنج شنبه 20 مهر 1396, 23:53 عصر
سلام به همه


من میخواستم تو یه کنترلر از فیلتر ajaxonly استفاده کنم به این صورت :



[ajaxonly]



با توجه به آموزش های توی نت نتونستم کاری کنم و همه ی کد ها ارور میداد لطفا اگر کسی بلده راهنماییم کنه

Moien Tajik
جمعه 21 مهر 1396, 12: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, 19: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,

};

}