ASP.NET MVC Html.ValidationSummary (true) model hataları görüntülemiyor


194

Html.ValidationSummary ile ilgili bir sorunum var. ValidationSummary'da özellik hatalarını görüntülemek istemiyorum. Ve Html.ValidationSummary (true) ayarladığımda, ModelState hata mesajlarını görüntülemez. Dize üzerinde denetleyici eyleminde bir İstisna olduğunda

MembersManager.RegisterMember(member);

catch bölümü ModelState'e bir hata ekler:

ModelState.AddModelError("error", ex.Message);

Ancak ValidationSummary bu hata iletisini görüntülemez. Html.ValidationSummary (false) ayarladığımda tüm iletiler görüntüleniyor, ancak özellik hatalarını görüntülemek istemiyorum. Bu sorunu nasıl düzeltebilirim?

İşte kullanıyorum kodu:

Model:

public class Member
{
        [Required(ErrorMessage = "*")]
        [DisplayName("Login:")]
        public string Login { get; set; }

        [Required(ErrorMessage = "*")]
        [DataType(DataType.Password)]
        [DisplayName("Password:")]
        public string Password { get; set; }

        [Required(ErrorMessage = "*")]
        [DataType(DataType.Password)]
        [DisplayName("Confirm Password:")]
        public string ConfirmPassword { get; set; }
}

Denetleyici:

[HttpPost]
public ActionResult Register(Member member)
{
    try
    {
        if (!ModelState.IsValid)
            return View();

        MembersManager.RegisterMember(member);
    }
    catch (Exception ex)
    {
        ModelState.AddModelError("error", ex.Message);

        return View(member);
    }
}

Görünüm:

<% using (Html.BeginForm("Register", "Members", FormMethod.Post, 
                        new { enctype = "multipart/form-data" })) {%> 
    <p>
        <%= Html.LabelFor(model => model.Login)%>
        <%= Html.TextBoxFor(model => model.Login)%>
        <%= Html.ValidationMessageFor(model => model.Login)%>
    </p>

    <p>
        <%= Html.LabelFor(model => model.Password)%>
        <%= Html.PasswordFor(model => model.Password)%>
        <%= Html.ValidationMessageFor(model => model.Password)%>
    </p>

    <p>
        <%= Html.LabelFor(model => model.ConfirmPassword)%>
        <%= Html.PasswordFor(model => model.ConfirmPassword)%>
        <%= Html.ValidationMessageFor(model => model.ConfirmPassword)%>
    </p>

    <div>
        <input type="submit" value="Create" />
    </div>

    <%= Html.ValidationSummary(true)%>
<% } %>

Yanıtlar:


324

ValidationSummary bayrağının çalışmasının sadece string.emptyanahtar olarak ModelErrors görüntüleyeceğine inanıyorum . Aksi takdirde bir özellik hatası olduğu varsayılır. Eklediğiniz özel hatanın anahtarı 'error' olduğundan ValidationSummary (true) çağrıldığında görüntülenmez. Özel hata mesajınızı aşağıdaki gibi boş bir anahtarla eklemeniz gerekir:

ModelState.AddModelError(string.Empty, ex.Message);

9
@LordCover: Sanırım bu bir hata değil, "tasarlandığı gibi çalışıyor" - varsayılan olarak kullanılan ValidationSummary () aşırı yüklenmesi, modelin özellikleri ile ilişkili ModelState hatalarını hariç tutar. Bu, bu hataları Html.ValidationMessageFor () tarafından temsil edilecek şekilde, her bir özellik için özette çoğaltılmadan çağırır. Unutmayın ki, boş olmayan bir anahtarla eklenen herhangi bir model hatasının, anahtar bir özelliğin adıyla eşleşmese bile bir model özelliğiyle ilişkili olduğu varsayılır.
Daniel Schaffer

26
Diğer uygulayıcılar için sadece bir not: ModelState.AddModelError(string.Empty, ex);işe yaramadı. Sen kullanmalısınız ModelState.AddModelError(string, string)yukarıda gösterildiği gibi aşırı.
wolfyuk

2
Güncelleme: MVC4'te artık durum böyle değil. ModelState.AddModelError ("", ex.Message); işleri
Neil Thompson

4
MVC5 Hala işe almak için ex.Message çağırmak gerekiyordu.
smiggleworth

günü kurtardı!
MVC5'in

67

Belirtilen bir anahtar için validationMessage gösterebileceğinizden, bu daha iyi çalışır:

    ModelState.AddModelError("keyName","Message");

ve şu şekilde görüntüleyin:

    @Html.ValidationMessage("keyName")

28

Bunun biraz eski olduğunu ve 147 oyla cevap olarak işaretlendiğini biliyorum, ancak dikkate alınması gereken başka bir şey var.

Gerekirse ValidationSummary'da tüm model hatalarına, adlı ve string.Empty anahtarlarına sahip olabilirsiniz. ValidationSummary'de bunu yapacak bir aşırı yüklenme var.

    //   excludePropertyErrors:
    //   true to have the summary display model-level errors only, or false to have
    //   the summary display all errors.
    public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors);

resim açıklamasını buraya girin


5
Evet! Sadece değişiklik @Html.ValidationSummary(true, "", new { @class = "text-danger" })için@Html.ValidationSummary(false, "", new { @class = "text-danger" })
Xeningem

7

Belki böyle:

[HttpPost]
public ActionResult Register(Member member)
{
    try
    {
       if (!ModelState.IsValid)
       {
          ModelState.AddModelError("keyName", "Form is not valid");
          return View();
       }
       MembersManager.RegisterMember(member);
    }
    catch (Exception ex)
    {
       ModelState.AddModelError("keyName", ex.Message);
       return View(member);
    }
}

Ve ekranda ekleyin:

<div class="alert alert-danger">
  @Html.ValidationMessage("keyName")
</div>

VEYA

<div class="alert alert-danger">
  @Html.ValidationSummary(false)
</div>

5
@Html.ValidationSummary(false,"", new { @class = "text-danger" })

Bu satırı kullanmak yardımcı olabilir


Yukarıdaki satırı cshtml dosyasına ekleyin.
sachind

2

Benim durumumda geri dönüş nedeniyle çalışma değildi.

Kullanmak yerine:

return RedirectToAction("Rescue", "CarteiraEtapaInvestimento", new { id = investimento.Id, idCarteiraEtapaResgate = etapaDoResgate.Id });

Kullandım:

return View("ViewRescueCarteiraEtapaInvestimento", new CarteiraEtapaInvestimentoRescueViewModel { Investimento = investimento, ValorResgate = investimentoViewModel.ValorResgate });

Bu bir model, bu yüzden ModelState.AddModelError("keyName","Message");bir modelle çalışması zorunludur.

Bu cevap nedenini gösteriyor. DataAnnotations ile doğrulama ekleme


0

Neredeyse her şey doğru görünüyorsa, dikkat edilmesi gereken başka bir şey, doğrulama özetinin bazı CSS aracılığıyla açıkça gizlenmemesini sağlamaktır gibi geçersiz kılma :

.validation-summary-valid {
    display: none;
}

@Html.ValidationSummaryÖzet, validation-summary-validsınıfla dinamik olarak oluşturulduğundan, bu da gizli görünmesine neden olabilir .


0

Deneyebilirsin,

<div asp-validation-summary="All" class="text-danger"></div>

not - bu bir <div> olmalıdır, eğer bir <span> ise oluşturmaz.
Stephen Angell

-4

Görünümünüzün en alt kısmına ekleyin:

@section Scripts {@ Scripts.Render ("~ / bundles / jqueryval")}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.