2012-05-23 31 views
4

這是我在這裏發佈的第一個問題,所以如果缺少任何東西,請原諒我。我會更新所需的任何信息。C#MVC 3驗證在特定視圖上失敗

說明

我的工作我的第一個C#.NET MVC-3的應用程序。我使用實體框架4.0和Razor視圖引擎。

對於大部分視圖,我使用包含部分類實例的視圖模型。該部分類是從EF類派生的,並且包含這些類成員上的數據註釋。這工作非常漂亮,現在我所有使用該視圖模型的視圖都對受影響的文本框進行了驗證。例子:

分部類:

[MetadataType(typeof(DataPackageMetaData))] 
public partial class DataPackage 
{ 
    //empty 
} 

public class DataPackageMetaData 
{ 
    [Required] 
    [StringLength(50)] 
    public string DataPackageID { get; set; } 

    ... (a lot more stuff like this) ... 
} 

視圖模型:

public class PackageInfo 
{ 
    // Registration Package information 
    public DataPackage package { get; set; } 
    public Reviewer reviewer { get; set; } 
    public PackageTracking trackingSave { get; set; } 

    <...> 

    //Constructor 
    public PackageInfo() 
    { 
     package = new DataPackage(); 
     reviewer = new Reviewer(); 
     trackingSave = new PackageTracking(); 
    } 
} 

因此,所有的驗證工具和的東西 「只是工作。」在視圖中(它實際上是部分視圖的一部分),我只是放了一個「TextBoxFor」。然後如果驗證失敗,一個友好的錯誤消息發佈紅​​色:

查看:

@Html.TextBoxFor(model => Model.package.DataPackageID, new { @class = "short", @id = "DataPackageID" }) 
@Html.ValidationMessageFor(model => Model.package.DataPackageID, "The Data Package ID is required and cannot be longer than 50 characters") 

問題

我遇到的問題是現在我已經轉移到程序的報告方面,我想要一個可以傳遞「DateIn」和「DateOut」表單值(除其他外)的新ViewModel,以便生成自定義報告查詢。我希望能夠驗證DateIn和DateOut值實際上是日期值。出於某種原因,這是行不通的。

視圖模型:

public class PackageVals 
{ 
    <...> 

    // Date value for formatted "Date In" value 
    [DataType(DataType.Date)] 
    [DisplayName("Date In")] 
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)] 
    [Required] 
    public DateTime DateIn { get; set; } 

    // Date value for formatted "Date Out" value 
    [DataType(DataType.Date)] 
    [DisplayName("Date Out")] 
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)] 
    [Required] 
    public DateTime DateOut { get; set; } 

    <... more stuff ...> 
} 

查看

@Html.TextBoxFor(model => Model.DateIn, new { @class = "small", @id = "DateIn"}) 
@Html.ValidationMessageFor(model => Model.DateIn, "A valid date must be entered in the format mm/dd/yyyy.") 
<...> 
@Html.TextBoxFor(model => Model.DateOut, new { @class = "small", @id = "DateOut"}) 
@Html.ValidationMessageFor(model => Model.DateOut, , "A valid date must be entered in the format mm/dd/yyyy.") 

注意,在所有情況下,我使用的是再嵌入其他視圖局部視圖。在應用的報告生成部分有幾種不同的視圖,幾乎所有的視圖都需要「DateIn」和「DateOut」表單值。

我跑出來的東西來看待,在他們看的時間。現在,我只是錯誤陷阱壞的日期值在控制器和傳回一個空視圖模型,以保持用戶從看到死亡的黃色屏幕。

我知道驗證是基於jQuery,但我不認爲我在那裏做任何事情都可能導致問題。這裏是我的整個jQuery腳本:

jQuery腳本

$(document).ready(function() { 
    // Purple box autocomplete Stuff 
    $("#Product").autocomplete({ source: '/SharedFunctions/AutoFillProduct' }); 
    $("#ActiveIngredient").autocomplete({ source: '/SharedFunctions/AutoFillActiveIngredient' }); 
    $("#Applicant").autocomplete({ source: '/SharedFunctions/AutoFillApplicant' }); 

    // Purple box autocomplete Stuff 
    $("#DataType").autocomplete({ source: '/SharedFunctions/AutoFillDataType' }); 

    // Purple Box datepicker stuff 
    $("#DateReceived").datepicker({ dateFormat: "mm/dd/yy" }); 
    $("#OutDate").datepicker({ dateFormat: "mm/dd/yy" }); 

    // Silver box datepicker stuff; Also used by Reports 
    $("#DateIn").datepicker({ dateFormat: "mm/dd/yy" }); 
    $("#DateOut").datepicker({ dateFormat: "mm/dd/yy" }); 

    // Alternate table row colors 
    $("table.center > tbody tr:even").css("background-color", "#F2F8FF"); 
}); 

任何幫助,您可以給我搞清楚了這一點將是巨大的。讓我知道是否還有其他需要的東西。

再次感謝。

附加信息

我想澄清一下,萬一有任何混淆: 我有兩個的ViewModels: 第一個視圖模型(稱爲PackageInfo)包含一個實體框架模型創建的對象的實例。 PackageInfo中的值在視圖中被烘焙的「簡單」MVC驗證正確驗證。

第二個ViewModel(稱爲PackageVals)包含DateTime值。 PackageVals中的值未在視圖中驗證。

+0

什麼是您收到的錯誤? –

+1

另外我注意到你的'DisplayFormat'屬性值爲'{0:dd/MM/yyyy}',而你的驗證表明格式必須是'mm/dd/yyyy'。這是故意的嗎? –

+0

我看到一個錯誤的唯一時間是如果表單值傳入,並且它們不是日期值。例如,如果我在DateIn字段中傳遞「24ashugfdahu9ahgahui」,我得到一個'String未被識別爲有效的DateTime'錯誤。我在Controller中的try-catch塊中捕獲了這個錯誤,所以錯誤永遠不會通過,但是用戶永遠不知道他們爲什麼沒有得到任何響應。 – War2d2

回答

0

這個問題最終在控制器中出現,這是我之前沒有發佈過的唯一代碼。我認爲如果我最初發布了這個消息,那麼@Mystere Man或者任何其他善於嘗試幫助我的人都會立即採取行動。

發生了什麼事情是因爲我已經將Controller函數的參數作爲FormCollection變量而不是模型變量,因此數據被傳入而未經過模型的驗證檢查。

下面是工作代碼:

[HttpPost] 
    public ActionResult RptPkgsRecd(PackageVals model) 
    { 
     ViewBag.CurrentPage = "reports"; 
     try 
     { 
      if (ModelState.IsValid) 
      { 
       PackageVals pv = new PackageVals(); 
       pv.dps = regpacksRepository.GetSubmitted(model.datePass.DateIn, model.datePass.DateOut).ToList(); 
       return View(pv); 
      } 
      else 
      { 
       PackageVals pv = null; 
       return View(pv); 
      } 
     } 
     catch(SystemException ex) 
     { 
      var error = ex.ToString(); 
      this.ModelState.AddModelError(error, ex); 
      PackageVals pv = null; 
      return View(pv); 
     } 
    } 
0

使您的DateTime值可以爲空。如果你需要他們,那麼確保他們有必要的屬性。

如果你的對象不能爲空,那麼你需要一個獨立於你的數據模型的視圖模型。 ViewModel允許您根據視圖的需要對其進行定製,而不考慮數據模型的需求。

+0

我會給一個空,並讓你知道。感謝您的評論。 – War2d2

+0

使DateTime值可以爲空並不會改變任何內容。它仍然允許將無效字符串從視圖傳回控制器,而不檢查有效的日期格式。 – War2d2

+0

@ War2d2 - 然後我不確定你做錯了什麼,因爲我保證你使用可以爲空的日期時間字段將在日期格式上進行驗證。在測試應用程序中使用簡單視圖進行測試,您將看到我的意思。 –