Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TextBoxFor()未生成验证标记_C#_.net_Asp.net Mvc 4_Entity Framework 5 - Fatal编程技术网

C# TextBoxFor()未生成验证标记

C# TextBoxFor()未生成验证标记,c#,.net,asp.net-mvc-4,entity-framework-5,C#,.net,Asp.net Mvc 4,Entity Framework 5,我有一个SQL Server 2012,其中我有两列标题和月份的奖励表。标题为varchar(256),不能为空。月份为int,可以为NULL 使用VS2012 Ultimate和EF 5.0.0,MVC4应用程序中的TextBoxFor helper不会为上面的标题栏生成验证(data val=“required”和data val required=“required message”),但在同一视图中,MONTH获得了正确的验证标记。.edmx设计器确实显示标题不可为空,但是,自动生成的A

我有一个SQL Server 2012,其中我有两列标题和月份的奖励表。标题为varchar(256),不能为空。月份为int,可以为NULL

使用VS2012 Ultimate和EF 5.0.0,MVC4应用程序中的TextBoxFor helper不会为上面的标题栏生成验证
(data val=“required”和data val required=“required message”)
,但在同一视图中,MONTH获得了正确的验证标记。.edmx设计器确实显示标题不可为空,但是,自动生成的AWARD.cs文件没有
[必需]
标题列的属性

我能试试什么

@model MyProject.Models.AWARD

@{
    ViewBag.Title = "Add Award";
    Layout = "~/Views/Shared/_EditorLayout.cshtml";
}

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Add Award</legend>
        <table>
            <tr>
                <td>
                    @Html.LabelFor(model => model.TITLE)
                </td>
                <td>
                    @Html.TextAreaFor(model => model.TITLE)
                    <br />@Html.ValidationMessageFor(model => model.TITLE)
                </td>
            </tr>
        <tr>
            <td>
                @Html.LabelFor(model => model.MONTH)
            </td>
            <td>@Html.DropDownListFor(model => model.MONTH, new SelectList(MyProject.Models.Helpers.Months, "key","value"), "[Not Selected]")
                <br />@Html.ValidationMessageFor(model => model.MONTH)
            </td>
        </tr>

            <tr>
                <td>
                    <input type="submit" value="Add" />
                </td>
                <td>
                    @Html.ActionLink("Cancel", "Index", null, new { @class = "cancel-button" })</td>
            </tr>
        </table>
    </fieldset>
}
@model MyProject.Models.AWARD
@{
ViewBag.Title=“添加奖励”;
Layout=“~/Views/Shared/\u EditorLayout.cshtml”;
}
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
加奖
@LabelFor(model=>model.TITLE)
@Html.TextAreaFor(model=>model.TITLE)

@Html.ValidationMessageFor(model=>model.TITLE) @LabelFor(model=>model.MONTH) @DropDownListFor(model=>model.MONTH,新选择列表(MyProject.Models.Helpers.Months,“key”,“value”),“[未选择]”)
@Html.ValidationMessageFor(model=>model.MONTH) @ActionLink(“取消”,“索引”,null,新建{@class=“取消按钮”}) }
您不应该将视图直接绑定到数据映射实体。您应该创建视图模型类来包装传递给视图和从视图传递的数据,然后从控制器填充数据对象

然后,您可以在视图模型上执行所需的验证,而不会影响生成的映射类

型号

public class AwardViewModel
{
    [Required, StringLength(30)]
    public string Title { get; set; }
    ....
}
查看

@model AwardViewModel

@using (Html.BeginForm()) {
    @Html.EditorFor(m => m.Title)
    @Html.ValidationMessageFor(m => m.Title)
    ...
}
控制器

[HttpPost]
public ActionResult Create (AwardViewModel model)
{
    /* Create new AWARD in entity context, populate
       with relevant fields from model and commit. */
}

您不应该将视图直接绑定到数据映射实体。您应该创建视图模型类来包装传递给视图和从视图传递的数据,然后从控制器填充数据对象

然后,您可以在视图模型上执行所需的验证,而不会影响生成的映射类

型号

public class AwardViewModel
{
    [Required, StringLength(30)]
    public string Title { get; set; }
    ....
}
查看

@model AwardViewModel

@using (Html.BeginForm()) {
    @Html.EditorFor(m => m.Title)
    @Html.ValidationMessageFor(m => m.Title)
    ...
}
控制器

[HttpPost]
public ActionResult Create (AwardViewModel model)
{
    /* Create new AWARD in entity context, populate
       with relevant fields from model and commit. */
}

你能发布你的viewmodel吗?你能发布你的viewmodel吗?Ant P这是我在各种论坛上找到的相同的“答案”,从我的一点经验来看,这种方法有它自己的包袱——比如缺少导航(关系数据库)属性——除非你将数据库模型与viewmodel中的相同。我甚至同意你的观点——但我想解决眼前的问题:为什么TextBoxFor不提供验证HTML,而DropDownListFor是——在同一个HTML表单中。此外——我知道我可以自己在TextBoxFor中添加验证标记并完成它,或者在.edmx树下的AWARD.cs文件中添加
[必需]
属性。但这对我来说更像是一种黑客行为。粘贴此处以供参考:非常有用的链接-直到MS提出了从数据库生成代码的某种替代视图:我不确定缺少导航属性是什么意思-这是视图模型的全部观点。视图模型是视图的模型,而不是数据实体的模型。您为它提供视图所需的任何信息,而这并不一定局限于来自一个业务实体/类的信息。毫无疑问,直接与您的视图共享您的业务实体是一种糟糕的做法——它会直接导致您遇到像这里这样的问题。您的视图不需要(实际上也不应该)知道您的数据模型。Ant P这是我在各种论坛上找到的同一个“答案”,根据我的一点经验,这种方法有自己的包袱——比如缺少导航(关系数据库)属性——除非您将数据库模型与ViewModel中的数据库模型相匹配。我甚至同意你的观点——但我想解决眼前的问题:为什么TextBoxFor不提供验证HTML,而DropDownListFor是——在同一个HTML表单中。此外——我知道我可以自己在TextBoxFor中添加验证标记并完成它,或者在.edmx树下的AWARD.cs文件中添加
[必需]
属性。但这对我来说更像是一种黑客行为。粘贴此处以供参考:非常有用的链接-直到MS提出了从数据库生成代码的某种替代视图:我不确定缺少导航属性是什么意思-这是视图模型的全部观点。视图模型是视图的模型,而不是数据实体的模型。您为它提供视图所需的任何信息,而这并不一定局限于来自一个业务实体/类的信息。毫无疑问,直接与您的视图共享您的业务实体是一种糟糕的做法——它会直接导致您遇到像这里这样的问题。您的视图不需要(实际上也不应该)知道您的数据模型。