2011-03-18 24 views
11

ASP.NET MVC 2.0'de doğrulama ile ilgili bir sorunum var. Kullanıcı isteğini gerçekleştirmek için Kontrolörde aynı Eylemi kullanırım. Örneğin
:Doğrulama iletileri, sayfa yüklenirken görüntüleniyor

public ActionResult Index(ReportModel model) 
{ 
    if (!model.IsInitialDisplay && ModelState.IsValid) 
    { 
     model.Result = service.GetResult(model);     
    } 
    return View(model); 
} 

ReportModel, ben sayfa ilk görüntülenen olup olmadığını belirlemek için bir bayrak IsInitialDisplay tanımlayın:

public class ReportModel 
{ 
    [Required(ErrorMessage = "*")] 
    public string Criteria { get; set; } 
    public bool IsInitialDisplay { get; set; } 
    public ReportResult Result { get; set; } 

    public ReportModel() 
    { 
     IsInitialDisplay = true; 
    } 
} 

Ve View, aşağıdaki kodu kullanabilirsiniz

:

<% using (Html.BeginForm()) 
    { %> 
<table> 
    <tr> 
     <th> 
      Criteria: 
     </th> 
     <td> 
      <%= Html.TextBox("Criteria", "") %> 
      <%= Html.ValidationMessage("Criteria") %> 
     </td> 
    </tr> 
</table> 
<br /> 
<input type="submit" value="Submit" /> 
<%= Html.Hidden("IsInitialDisplay", false) %> 
<% } %> 

beklediğim gibi kullanıcılar Kriterleri için herhangi bir değer değil girişi yapmak Gönder tuşuna basınız, eğer doğrulama için hata mesajı di olacak yayvan.
Ancak, her zaman ilk sayfa yüklemesinde görüntülenen doğrulama hata mesajı nasıl önlenir bilmiyorum?
Kimse biliyor mu? Teşekkürler,

[Güncellendi]
Ben aşağıda benim Eylem yöntemi güncelledik ve iyi görünüyor oluyor:

public ActionResult Index(ReportModel model) 
{ 
    // Collecting some commons data here... 

    if (model.IsInitialDisplay) 
    { 
     ModelState.Clear(); 
    } 
    else if (ModelState.IsValid) 
    { 
     model.Result = service.GetResult(model);     
    } 
    return View(model); 
} 

cevap

-1

Modeli

public class ReportModel 
{ 
    [Required(ErrorMessage = "*")] 
    public string Criteria { get; set; } 
} 

Görünüm

<% Html.EnableClientValidation(); %>  

<% using (Html.BeginForm()) 
{ %> 
    <%= Html.TextBoxFor(model => model.Criteria) %> 
    <%= Html.ValidationMessageFor(model => model.Criteria) %> 

    <input type="submit" value="Submit" /> 
<% } %> 

İyi çalışıyor

+0

Projemde, _ReportModel.Criteria_ için karmaşık model nesnesini kullanıyorum. Yani öneriniz uygun değil. – aquanilium

32

İlk sayfa yüklemesinde bir hata mesajının görüntülenmesinin nedeni, denetleyici eyleminizin argüman olarak ReportModel modelini almasıdır. Bu eyleme /Home/Index ile ilk kez eriştiğinizde argümanlar geçmiyorsunuz ve varsayılan model bağlayıcı bir ReportModel örneğine bağlanmaya çalıştığında doğrulama hatalarını tetikliyor.

Kötü hem işleme için aynı eylemi kullanmak pratik ve form gönderimini taşıma ama gerçekten yapmak istiyorsanız böyle deneyebilirsiniz: Bu durumda

public ActionResult Index(bool? isInitialDisplay) 
{ 
    if (isInitialDisplay.HasValue && !isInitialDisplay.Value) 
    { 
     var model = new ReportModel(); 
     UpdateModel(model); 
     if (ModelState.IsValid) 
     { 
      model.Result = service.GetResult(model);     
     } 
     return View(model); 
    } 

    // Initial request 
    return View(new ReportModel()); 
} 

artık ihtiyaç Modelinizdeki IsInitialDisplay özelliği veya bunu true olarak ayarlayan yapıcı. gibi bu ilk yük olup olmadığını belirlemek için http yöntemini kullanan

[HttpGet] 
public ActionResult Index(ReportsModel model) 
{ 
    ModelState.Clear(); //clears the validation 

    return View(model); 
} 

[HttpPost] 
public ActionResult Index(ReportsModel model, string unused) 
{ 
    ... 
} 

(:

public ActionResult Index() 
{ 
    var model = new ReportModel(); 
    return View(model); 
} 

[HttpPost] 
public ActionResult Index(ReportModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 
    model.Result = service.GetResult(model);     
    return View(model); 
} 
+0

Öneriniz için teşekkürler, ancak projemde, _ReportModel.Criteria_ için bazı ortak verileri topladım. Bu nedenle, bu iki iş mantığını iki eylemde (modelle birlikte & modelsiz) çoğaltmak istemiyorum. – aquanilium

+0

, bu hatayı, anlattığınız nedenden dolayı aldığımdan dolayı merak ediyor, ancak Eylem bir modeli kabul ediyor çünkü bir dizi formun parçası ve POST'lu, ardından da asıl sayfanın bir sonrakini gönderiyor .. Bu yüzden neden kötü bir uygulama olacağından emin değilim – BigOmega

+0

Neden "aynı eylemi hem biçimlendirme hem de işleme için kullanmanız" kötü bir uygulama? Sorun nedir? – SandRock

5

İşte bazı iyi cevaplar birleştiren basit bir çözüm:

Bu söyleniyor

, burada önerilen yöntem var Darin çözümü).

En önemlisi, bir tane kendiniz yenilerini değiştirmek yerine, kontrol cihazınızı MVC'ye sahiptir. Bağımlılık enjeksiyonunu kullanırsanız veya sorgu dizesiyle (bağlamlanmış bir kaynak kimliği gibi) gelen başka içeriğe sahip verileriniz varsa bu önemlidir.

+0

bunun için teşekkürler – victor

İlgili konular