在ASP中从视图模型保存到模型.净MVC

本文关键字:模型 保存 MVC 视图 ASP | 更新日期: 2023-09-27 17:51:22

我有两个模型,一个代码模型和一个标签模型,它们通过多对多关系链接在一起。我试图添加一个代码条目,其中包括使用视图模型的许多标签的可能选择(使用我的视图中的标签的复选框)。我得到错误:

传入字典的模型项的类型为'System.Collections.Generic.List'1[StoRed.Models. list]。,但是这个字典需要一个类型为'System.Collections.Generic.IEnumerable ' 1[StoRed.Models.CodeTagViewModel]'的模型项

感觉就像我需要以某种方式转换我的数据到可接受的格式之前,试图将其保存到表中,但我是新的MVC,我有麻烦找到任何有用的信息在互联网上关于我的具体问题。如有任何帮助,我将不胜感激。

代码模型

public class Code
{
    [Key]
    public int CodeID { get; set; }
    [Required]
    [StringLength(30)]
    public string Title { get; set; }
    [Required]
    [StringLength(150)]
    public string Description { get; set; }
    public DateTime DateAdded { get; set; }
    public DateTime LastUpdated { get; set; }
    [Required]
    [StringLength(30)]
    public string Project { get; set; }
    [Required]
    [StringLength(30)]
    public string CMS { get; set; }
    public int DotNetVersion { get; set; }
    [Required]
    [StringLength(150)]
    public string Dependencies { get; set; }
    [StringLength(30)]
    public string Author { get; set; }
    public string CodeFile { get; set; }
    [Required]
    [StringLength(100)]
    public string TFSLocation { get; set; }
    ////Creates a relationship in the DB with Tag
    //[ForeignKey("TagID")]
    public virtual ICollection<Tag> Tags { get; set; }
    ////Purely for API
    //[Required]
    public int TagID { get; set; }
}

标签模型

public class Tag
{
    [Key]
    public int TagID { get; set; }
    [Required]
    [StringLength(30)]
    public string TagName { get; set; }
    public virtual ICollection<Code> Code { get; set; }
}

public class Context : DbContext
{
    public DbSet<Code> Code { get; set; }
    public DbSet<Tag> Tags { get; set; }
}

视图模型

public class CodeTagViewModel
{
    public Tag Tag { get; set; }
    public Tag TagID { get; set; }
    public List<Tag> Tags { get; set; }

    public int CodeID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime DateAdded { get; set; }
    public DateTime LastUpdated { get; set; }
    public string Project { get; set; }
    public string CMS { get; set; }
    public int DotNetVersion { get; set; }
    public string Dependencies { get; set; }
    public string Author { get; set; }
    public string CodeFile { get; set; }
    public string TFSLocation { get; set; }
}

代码控制器的相关部分

    [HttpPost]
    public ActionResult Create(CodeTagViewModel codeTagViewModel)
    {
        if (ModelState.IsValid)
        {
            Code code = new Code();
            Tag tag = new Tag();
            var codeTag = new CodeTagViewModel();
            code.Title = codeTagViewModel.Title;
            code.Description = codeTagViewModel.Description;
            code.DateAdded = codeTagViewModel.DateAdded;
            code.LastUpdated = codeTagViewModel.LastUpdated;
            code.Project = codeTagViewModel.Project;
            code.CMS = codeTagViewModel.CMS;
            code.DotNetVersion = codeTagViewModel.DotNetVersion;
            code.Dependencies = codeTagViewModel.Dependencies;
            code.Author = codeTagViewModel.Author;
            code.CodeFile = codeTagViewModel.CodeFile;
            code.TFSLocation = codeTagViewModel.TFSLocation;
            code.Tags = codeTagViewModel.Tags;
            db.Code.Add(code);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }
        return View(codeTagViewModel);
    }

在ASP中从视图模型保存到模型.净MVC

你最好的选择是创建一些提供者/经理/服务/工厂/处理程序——选择一个名字,最有意义的工作就是做内通过您的系统的数据流——负责ViewModel,将视图模型的属性映射到领域模型的一个实例在持久化域模型数据存储之前,本身或通过水化域模型库层。您既可以手动执行此操作,也可以使用AutoMapper之类的工具。下面是一个快速的手动示例:

在你的web项目中创建一个带有接口和依赖处理程序的CommandHandlers文件夹:

public interface ICodeCommandHandler
{
    int Save(CodeTagViewModel input);
}
public class CodeCommandHandler : ICodeCommandHandler
{
    private IRepository<Code> repository;
    public CodeCommandHandler(IRepository<Code> repository)
    {
        this.repository = repository;
    }
    public int Save(CodeTagViewModel input)
    {
        Code code = new Code();
        Tag tag = new Tag();
        code.Title = input.Title;
        code.Description = input.Description;
        code.DateAdded = input.DateAdded;
        code.LastUpdated = input.LastUpdated;
        code.Project = input.Project;
        code.CMS = input.CMS;
        code.DotNetVersion = input.DotNetVersion;
        code.Dependencies = input.Dependencies;
        code.Author = input.Author;
        code.CodeFile = input.CodeFile;
        code.TFSLocation = input.TFSLocation;
        code.Tags.Add(tag);
        return repository.Save(code);
    }
}

然后在控制器中,通过构造函数注入ICodeCommandHandler,就像在CodeCommandHandler中使用存储库一样:

private readonly ICodeCommandHandler commandHandler;
public CodeController(ICodeCommandHandler commandHandler)
{
    this.commandHandler = commandHandler;
}
[HttpPost]
public ActionResult Create(CodeTagViewModel codeTagViewModel)
{
    if (!ModelState.IsValid)
    {
        return View(codeTagViewModel);
    }
    var id = codeCommandHandler.Save(codeTagViewModel);
    // maybe do something useful with the document id after save
    return RedirectToAction("Index");  
}

为了保持Repository美观和简单,下面是它的样子:

public interface IRepository<T>
{
    int Save(T entity);
}
public class CodeRepository : IRepository<Code>
{
    public int Save(Code entity)
    {
        using (var context = new Context())
        {
            context.Code.Add(entity);
            context.SaveChanges();
        }
    }
}

我没有详细介绍依赖注入方面的内容,因为这不是问题的一部分但这应该会让你知道从哪里开始