PDA

View Full Version : سوال: Validation in PartialView



aroshanzamir
جمعه 05 دی 1393, 11:24 صبح
سلام وقت بخیر

سوال را با مثال توضیح میدهم :
این کد های بخش Layout است که یک لینک آژاکس قرار دارد که این لینک یک پارشیال ویو را برگشت میدهد :

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My ASP.NET Application</title>
<link href="~/Content/Site.css" rel="stylesheet" type="text/css" />
<link href="~/Content/bootstrap.min.css" rel="stylesheet" type="text/css" />
<script src="~/Scripts/jquery-1.9.1.js"></script>
<script src="~/Scripts/modernizr-2.6.2.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>


</head>
<body>

<div class="container body-content">
<br /><br />
@Ajax.ActionLink("کمپانی های سازنده", "Sample",
"Home",
new AjaxOptions
{
HttpMethod = "GET",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "main-content"
}, new { area = "admin" })

<br /><br />
<div id="main-content">
@RenderBody()
</div>
</div>
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/bootstrap.min.js"></script>
</body>
</html>


این هم کنترولر من : که دو تا اکشن داره که یکیش فقط یک ویو ساده را برمیگردونه و یکیش یه پارشیال ویو برمیگردونه و ویو Index داره از مستر پیج من ارث بری می کنه ؟

public class HomeController : Controller
{
// GET: admin/Home
public ActionResult Index()
{
return View();
}


public PartialViewResult Sample()
{
return PartialView("_StudentValidate");
}
}


این هم پارشیال ویو :

@model ValidationForm.Areas.admin.Models.Student

<div class="col-md-12">
@using (Html.BeginForm("Create", "Home", FormMethod.Post, new { id="FormInsert" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(x => x.Name, new { @class = "col-md-2 control-label", })
<div class="col-md-10">
@Html.TextBoxFor(x => x.Name, new { @class = "form-control" })
@Html.ValidationMessageFor(x => x.Name, "", new
{
@class = "text-danger"
})
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Submit" class="btn btn-default" />
</div>
</div>
}
</div>


برنامه را اجرا کنیم و اکشن Index را فراخوانی می کنیم : بعد از اون بر روی لینک کمپانی های سازنده کلیک می کنیم و به صورت آژاکسی اون پارشیال ویو را بازگشت میدهد

مشکل اینجاست که اعتبار سنجی را انجانم نمیده :.....
این هم کلاس Student :

public class Student
{
public int Id { get; set; }

[Display(Name="Fisrt Name")]
[Required(ErrorMessage="Plese Enter Fist Name")]
public string Name { get; set; }

}}

یه چیز دیگه :

وقتی پارشیال ویو را از طریق Html.Partial() فرا خوانی کنیم اعتبار سنجی را انجام میده ولی وقتی از طریق یک متد اکشن فراخوانی کنیم مثل بالا اعتبار سنجی را انجام نمیده ؟

به نظرتون راهکار چیه ؟

aroshanzamir
جمعه 05 دی 1393, 11:30 صبح
من که کد ها را توی بلاک های خودش قرار دادم چرا داره این جوری نشون میده ؟

RIG000
جمعه 05 دی 1393, 11:37 صبح
اینجا رو ببین می تونه بهت کمکی کنه
http://stackoverflow.com/questions/12785086/mvc3-ajax-form-validation-with-partial-view-not-working

aroshanzamir
جمعه 05 دی 1393, 12:33 عصر
سلام دوست من RIG000 (http://barnamenevis.org/member.php?142362-RIG000)

جوابی نگرفتم خودت میتونی راهنمایی کنی ؟

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


<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>

مساله اینه که این دو اسکریپت در Layout وجود داره و نباید به هر پارشیال ویو اضافه کنیم ..

mohammadreza.najafipour
دوشنبه 08 دی 1393, 17:01 عصر
لینکی که دوستمون RIG000 (http://barnamenevis.org/member.php?142362-RIG000) فرستاده راهنمایی خوبی کرده.
در فراخوانی Ajax، در صورت موفقیت آمیز بودن اجرا، فیلدهایی که برای Validation مد نظرمون هست رو به صورت زیر باید صدا بزنیم:

$.validator.unobtrusive.parse($("#Name"));


ویرایش:
اگه جواب گرفتی حتما بهمون بگو، مرسی :لبخندساده:

aroshanzamir
پنج شنبه 11 دی 1393, 22:43 عصر
هر کاری می کنم Validation کار نمی کنه .....در صورتی که اگر Partial View را با Html.Partial فراخوانی کنیم کار می کنه ...
.................................................. .................................................. .................................................. .................................................. .....................
public class Student
{
[Required(ErrorMessage = "Plese Enter Name")]
public string Name { get; set; }

[Required(ErrorMessage = "Plese Enter Family")]
public string Family { get; set; }
}
.................................................. .................................................. .................................................. .................................................. .....................
then, Controller
public ActionResult Index()
{
return View();
}
public ActionResult Test()
{
return PartialView("_index");
}
.................................................. .................................................. .................................................. .................................................. .....................
layout :
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
<link href="~/Content/bootstrap.css" rel="stylesheet" />
<link href="~/Content/bootstrap-responsive.css" rel="stylesheet" />
<link href="~/Content/Site.css" rel="stylesheet" />


<script src="~/Scripts/jquery-1.9.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script src="~/Scripts/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
@RenderBody()
</div>
</body>
</html>
.................................................. .................................................. .................................................. .................................................. .....................
پارشیال ویو:
.................................................. .................................................. .................................................. .................................................. .....................
@model Total.Models.Student


@using (Html.BeginForm("Index", "home", FormMethod.Post, new { @class = "form-inline" }))
{
@Html.ValidationSummary(true, null, new { @class = "alert alert-error alert-block" })
<div class="control-group">
<label class="control-label">Name</label>
<div class="controls">
@Html.TextBoxFor(x => x.Name)
</div>
@Html.ValidationMessageFor(x => x.Name, null, new { @class = "help-inline" })
</div>
<div class="control-group">
<label class="control-label">Family</label>
<div class="controls">
@Html.TextBoxFor(x => x.Family)
</div>
@Html.ValidationMessageFor(x => x.Family, null, new { @class = "help-inline" })
</div>
<div class="control-group">
<label class="control-label"></label>
<div class="controls">
<button class="btn btn-primary" type="submit">
Send
</button>
</div>
</div>
}
.................................................. .................................................. .................................................. .................................................. .....................
ویو :
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Main.cshtml";
}

<h2>Index</h2>



<div class="row">
<div class="col-md-12">
@Ajax.ActionLink("Call ..", "Test", "home",
new AjaxOptions { HttpMethod = "GET", UpdateTargetId="Content" })
<div id="Content">
</div>
</div>
</div>

aroshanzamir
جمعه 12 دی 1393, 13:36 عصر
سلام دوستان بلاخره جوابش را پیدا کردم :



var $form = $("#Content").find("form");
$form.unbind();
$form.data("validator", null);
$.validator.unobtrusive.parse(document);

aroshanzamir
شنبه 13 دی 1393, 20:27 عصر
دوستان کسی به عیر از این روش راهکاری داره ؟
یعنی به همان صورت معمول می توان پیاده سازی را انجام داد ؟
عدم استفاده از این کد :



var $form = $("#Content").find("form");
$form.unbind();
$form.data("validator", null);
$.validator.unobtrusive.parse(document);

meisam12
یک شنبه 14 دی 1393, 19:02 عصر
شما کافی است فقط وضعیت valid بودن مدلتان یعنی از نوع Student را در کنترلر چک کنید.


if (ModelState.IsValid)
{
return PartialView("_StudentValidate");
}
else
{
return PartialView(model);
}

aroshanzamir
یک شنبه 14 دی 1393, 19:52 عصر
شما کافی است فقط وضعیت valid بودن مدلتان یعنی از نوع Student را در کنترلر چک کنید.


if (ModelState.IsValid)
{
return PartialView("_StudentValidate");
}
else
{
return PartialView(model);
}



سلام ممنون از پاسختون

خوب با این روش که فرم داره به سمت سرور ارسال میشه اونجا اعتبار سنجی انجام میشه ....

برای اینکه بتونیم قبل از ارسال به سرور اعتبار سنجی کنیم چه باید کرد ؟
منظورم اتبار سنجی در سمت کلاینت است ...