PDA

View Full Version : کار نکردن Html.ValidationSummary خارج از Html.BeginForm



ramin149
دوشنبه 21 اسفند 1391, 10:23 صبح
با سلام . من یک Html.ValidationSummary دارم که وقتی داخل Html.BeginForm قرار میگیره کار می کنه . اما وقتی خارج از Html.BeginForm قرار می دهم دیگه پیغام خطا را نشان نمی ده . با چه روشی میشه Html.ValidationSummary را Html.BeginForm مورد نظر مرتبط کرد . با تشکر

Saeed_m_Farid
یک شنبه 27 اسفند 1391, 19:30 عصر
ValidationSummary فقط یه فلگ هست که برای نمایش خطاهای عمومی در سطح مدل در فرم‌های تولید شده توسط VS.NET استفاده میشه، اگه میخواین یه پیغام عمومی در سطح مدل داشته باشید، در متد AddModelError، مقدار key را خالی وارد کنید:
ModelState.AddModelError(string.Empty, "There is something wrong with model.");
___________
کلاً منظورتون رو درست متوجه نشدم، نمونه کدتون رو اینجا بذارید تا بهتر بشه کمک کرد.
اگه منظورتون یک کلاس سفارشی برای اعتبار سنجی هست باید یه کلاس از نوع ValidationAttribute بسازید و برای استفاده از اون باید تو مدل یک DataAnnotation از نوع کلاس سفارشی خودتون تعریف کنید. مثلاً :

public sealed class MyPasswordValidator : ValidationAttribute
{
public int MinLength { set; get; }
public override bool IsValid(object value)
{
if (value == null) return false;
RegularExpressionAttribute regx = new RegularExpressionAttribute(@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$");
return (regx.IsValid(Convert.ToString(value).Trim())) && ((int)value >= MinLength) ;
}
}

public class DataClass
{
[DataType(DataType.EmailAddress)]
public string EmailAddress { get; set; }

[MyPasswordValidator(
MinLength = 6,
ErrorMessage = "Prepare better password!")]
public string Password { get; set; }
}

البته میتونید از IValidatableObject استفاده کنید یا IsValid رو override کنید که فعلاً به همین قناعت می کنیم ...

ramin149
دوشنبه 28 اسفند 1391, 10:10 صبح
منظورم این که اگر یک صفحه به صورت زیر طراحی کنیم به صورت کاملا درست کار می کنه .


<hgroup class="title">
<h1>@ViewBag.Title.</h1>
<h2>Create a new account.</h2>
</hgroup>

@using (Html.BeginForm()) {
@Html.ValidationSummary()

<fieldset>
<legend>Registration Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
</li>
<li>
@Html.LabelFor(m => m.ConfirmPassword)
@Html.PasswordFor(m => m.ConfirmPassword)
</li>
</ol>
<input type="submit" value="Register" />
</fieldset>
}

اما اگر @Html.ValidationSummary() را خارج از @using (Html.BeginForm()) قرار دهیم لیست خطا های validator را نمایش نمی ده


@Html.ValidationSummary()
@using (Html.BeginForm()) {


<fieldset>
<legend>Registration Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
</li>
<li>
@Html.LabelFor(m => m.ConfirmPassword)
@Html.PasswordFor(m => m.ConfirmPassword)
</li>
</ol>
<input type="submit" value="Register" />
</fieldset>
}

حالا می شه کاری گرد @Html.ValidationSummary() خارج از Html.BeginForm()) کار کنه ؟؟؟

Saeed_m_Farid
دوشنبه 28 اسفند 1391, 18:18 عصر
اینو امتحان کنین ببینین کار میکنه؟

@Html.ValidationSummary(false)
@Html.ValidationSummary(true, "Custom Validation Summary!!!")
@using (Html.BeginForm()) {
<fieldset>
<legend>Registration Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</li>
<li>
@Html.LabelFor(m => m.ConfirmPassword)
@Html.PasswordFor(m => m.ConfirmPassword)
@Html.ValidationMessageFor(m => m.ConfirmPassword)
</li>
</ol>
<input type="submit" value="Register" />
</fieldset>
}

اگه آره، بدون ValidationMessageFor برای فیلدها هم ببینید چه نتیجه ای میگیرین؟