gpt4 book ai didi

c# - 从 View 模型保存到 ASP.NET MVC 中的模型

转载 作者:行者123 更新时间:2023-11-30 16:20:26 25 4
gpt4 key购买 nike

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

传入字典的模型项的类型为“System.Collections.Generic.List”1[StoRed.Models.Code],但此字典需要一个类型为“System.Collections.Generic”的模型项.IEnumerable`1[StoRed.Models.CodeTagViewModel]'。

感觉我需要以某种方式将我的数据转换为可接受的格式,然后再尝试将其保存到表中,但我是 MVC 的新手,我无法在 Internet 上找到有关我的特定问题的任何有用信息。任何帮助将不胜感激。

代码模型

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

View 模型

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

代码 Controller 的相关部分

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

最佳答案

您最好的选择是创建某种类型的提供者/经理/服务/工厂/处理程序 - 选择一个就其在通过您的系统的数据流中所做的工作而言最有意义的名称 - 负责在将域模型持久化到数据存储之前,获取 ViewModel 并将 ViewModel 的属性映射到域模型的实例中,无论是本身还是通过将混合域模型传递到存储库层。您可以手动执行此操作,也可以使用 AutoMapper 之类的工具来执行此操作。这是一个快速的手动示例:

在您的 Web 项目中使用接口(interface)和相关处理程序创建一个 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);

}
}

然后在您的 Controller 中,通过构造函数注入(inject)注入(inject) 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();
}
}
}

我没有详细介绍依赖注入(inject)方面的事情,因为这不是问题的一部分,但这应该让您知道从哪里开始

关于c# - 从 View 模型保存到 ASP.NET MVC 中的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14255088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com