MVC C#元数据DataAnnotations混乱

时间:2018-10-15 21:24:00

标签: c# razor model-view-controller

我正在尝试使用元数据类来在重新生成模型类时保留我们的验证属性。但是,在提出的建议中,我一直遇到问题。

在更新或重新生成模型类时,它将使用自动生成的DatabaseModel.edmx > DatabaseModel.tt类来创建/更新tablename.cs。如果我不想丢失验证属性,则无法编辑这些内容。

根据Microsoft文档,我在Model文件夹中创建了Metadata.csPartial.cs类,甚至尝试使用以下示例代码为每个数据库表创建该类:

using System;
using System.ComponentModel.DataAnnotations;

namespace CApp.Models
{

    [MetadataType(typeof(ConsultantMetaData))]
    public partial class Consultant
    {
    }
    public class ConsultantMetaData
    {
        [Required]
        [Display(Name = "Name")]
        public string ConsultantName { get; set; }

        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public string ConsultantEmail { get; set; }

        [Required]
        [Display(Name = "Is Active")]
        public bool IsActive { get; set; }
    }
}

这是我开始出现歧义错误的时候。

  

“顾问”是“ CApp.Data.Consultant”之间的歧义引用   和“ CApp.Models.Consultant”

受影响的是创建默认索引,详细信息,创建,编辑和删除控制器以及后续视图的默认脚手架。默认情况下,所有这些都使用自动生成的模型类代码来获取和设置数据。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include ="ConsultantId,ConsultantName,ConsultantEmail,IsActive")] Consultant consultant)
{
    if (ModelState.IsValid)
    {
        db.Consultants.Add(consultant);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(consultant);
}

或者:

// GET: Consultants/Edit/5
public ActionResult Edit(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Consultant consultant = db.Consultants.Find(id);
    if (consultant == null)
    {
        return HttpNotFound();
    }
    return View(consultant);
}

我会得到隐式转换错误:

  

无法将类型'CApp.Data.Consultant'隐式转换为   'CApp.Models.Consultant'

在方法中,如果我将顾问更改为:

CApp.Data.Consultant consultant = db.Consultants.Find(id);

然后按常规方式获取数据,并且将忽略“显示验证”属性,并且仍然显示表列名而不是所需的“显示名”属性。

除了在视图(不是目标)视图中手动键入所需的列名称之外,不确定如何获取和显示模型数据,以便显示所需的信息。我觉得我在这里盘旋而行,在这个论坛上找不到我需要的答案。

我还正确地假设包含所需数据批注的元数据类需要根据表中的列完全匹配自动生成的模型,还是只需要指定需要的自定义列自定义显示名称还是其他自定义属性?

任何帮助将不胜感激。迫切需要举例说明。

1 个答案:

答案 0 :(得分:1)

当您试图在CApp.Models命名空间中添加元数据时,似乎在CApp.Data名称下有一个Consultant类!

您应该考虑使用相同的名称空间。您需要将CApp.Models更改为CApp.Data(或者以其他方式,但我不建议这样做)。

您对顾问的原始定义应为:

namespace CApp.Data
{
    public partial class Consultant
    {
        // some codes
    }
}

请注意,该类的原始定义也必须为 partial 。 然后,您的元数据应该在相同的名称空间中:

using System;
using System.ComponentModel.DataAnnotations;

namespace CApp.Data
{

    [MetadataType(typeof(ConsultantMetaData))]
    public partial class Consultant
    {
    }
    public class ConsultantMetaData
    {
        [Required]
        [Display(Name = "Name")]
        public string ConsultantName { get; set; }

        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public string ConsultantEmail { get; set; }

        [Required]
        [Display(Name = "Is Active")]
        public bool IsActive { get; set; }
    }
}