C# MVC 3 验证在特定 View 上失败

标签 c# asp.net-mvc-3 entity-framework-4 razor validation

这是我在这里发布的第一个问题,如果有任何遗漏,请原谅我。我会更新所要求的任何信息。

解释

我正在开发我的第一个 C#.Net MVC-3 应用程序。我正在使用 Entity Framework 4.0 和 Razor View 引擎。

对于大多数 View ,我使用包含分部类实例的 View 模型。该分部类派生自 EF 类,并包含这些类成员的数据注释。这工作非常顺利,现在我所有使用该 View 模型的 View 都对受影响的文本框进行了验证。示例:

部分类:

[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) ...
}

View 模型:

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();
    }
}

因此,该内容的所有验证内容都“有效”。在 View (实际上是部分 View 的一部分)中,我只是放置了一个“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 值确实是日期值。出于某种原因,这不起作用。

View 模型:

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.")

请注意,在所有情况下,我都使用部分 View ,然后将其嵌入到其他 View 中。应用程序的报告生成部分有几种不同的 View ,几乎所有 View 都需要“DateIn”和“DateOut”表单值。

我没有什么可看的了,也没有时间查看它们了。现在,我只是在 Controller 中错误捕获错误的日期值,并传回一个 null ViewModel 以防止用户看到黄色死亡画面。

我知道验证是基于 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");
});

如果你能帮我解决这个问题,那就太好了。如果您还需要什么,请告诉我。

再次感谢。

附加信息

我想澄清一下,以防出现任何混淆: 我有两个 View 模型: 第一个 ViewModel(称为 PackageInfo)包含从 Entity Framework 模型创建的对象实例。 PackageInfo 中的值正在通过内置的“简单”MVC 验证在 View 中正确验证。

第二个 ViewModel(称为 PackageVals)包含 DateTime 值。 PackageVals 中的值未在 View 中进行验证。

最佳答案

使您的日期时间值可以为空。如果您需要它们是必需的,请确保它们具有必需的属性。

如果您的对象不能为空,那么您需要一个独立于数据模型的 View 模型。 ViewModel 允许您根据 View 的需要自定义它,而不考虑数据模型的需要。

关于C# MVC 3 验证在特定 View 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10727320/

相关文章:

javascript - 如何从 JavaScript 调用 C# 函数?

MVC3 下的 Facebook OAuth2 和 DotNetOpenAuth

forms - MVC 3 - 将 FormCollection 解析为模型

entity-framework-4 - 我应该在构造函数中初始化集合吗

c# - Entity Framework 4.1 中带有 TransactionScope 的多个 dbcontext 的 SaveChanges()

c# - 在异步方法主体中获取当前任务实例

c# - 如何检查附加到 EF 上下文的 POCO 的状态?

c# - 使用动态键将 Json 解析为动态 c# 对象

asp.net - 嵌套 Razor 模板中的 @RenderSection

entity-framework - 使用 DDD 和 IoC 为 EF4 实现存储库