我试图与我的Desafio(挑战)和我的Tag模型建立多对多的关系,挑战可以有很多标签,标签可以与许多挑战相关,我已经放置了标签视图,问题是当我提交表单时,它表示该行的值为null:
public class Tag
{
public int Id { get; set; }
public string NomeTag { get; set; }
public string cor { get; set; }
public virtual ICollection<ApplicationUser> Users { get; set; }
public virtual ICollection<Desafio> Desafios { get; set; }
}
我将展示我的表现:
我的模特
代码〜
public class Desafio
{
public int DesafioId { get; set; }
public string TipoTrabalho { get; set; }
public virtual ApplicationUser User { get; set; }
public string ApplicationUserId { get; set; }
public string Descricao { get; set; }
public int TipoAvaliacaoId { get; set; }
public virtual TipoAvaliacao TipoAvaliacao { get; set; }
public decimal valor { get; set; }
public int Visualizacoes { get; set; }
public DateTime DataCriacao { get; set; }
public decimal lat { get; set; }
public decimal lon { get; set; }
public int IdSolucaoVencedora { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
Desafio(挑战)
public class DesafioCreate
{
public string Desafio { get; set; }
public string Descricao { get; set; }
public decimal ValorMonetario { get; set; }
public decimal lat { get; set; }
public decimal lon { get; set; }
public ICollection<TagDesafio> TagDesafio { get; set; }
}
public class TagDesafio
{
public int TagId { get; set; }
public string Nome { get; set; }
public bool Seleccionado { get; set; }
}
然后我有2个视图模型在视图中显示数据
DesafioCreate
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(DesafioCreate model, string[] selectedTag,HttpPostedFileBase file)
{
TipoAvaliacao TipoAvaliacao = db.TiposAvaliacao.Where(i => i.TipoAvaliacaoId == 1).FirstOrDefault();
if (ModelState.IsValid)
{
Desafio desafio = new Desafio();
desafio.lat = model.lat;
desafio.lon = model.lon;
desafio.TipoTrabalho = model.Desafio;
desafio.Descricao = model.Descricao;
desafio.DataCriacao = DateTime.Now;
desafio.TipoAvaliacao = TipoAvaliacao;
desafio.valor = 22;
desafio.Visualizacoes = 34;
desafio.ApplicationUserId = User.Identity.GetUserId();
var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/Anexos"), fileName);
var anexo = new Anexo();
anexo.Caminho = path;
anexo.NomeFicheiro = fileName;
anexo.DesafioId = desafio.DesafioId;
db.Desafios.Add(desafio);
atualizarTagsDesafio(desafio, selectedTag);
db.SaveChanges();
return RedirectToAction("Index");
}
preencherTagDesafio();
return View(model);
}
private void atualizarTagsDesafio(Desafio desafio,
string[] selectedTag)
{
if (selectedTag == null)
{
desafio.Tags = new List<Tag>();
return;
}
var selectedAutoresHS = new HashSet<string>(selectedTag);
var DesafioTag = new HashSet<int>( // line that cause the error
desafio.Tags.Select(a => a.Id)); // line that cause the error
var Tags = db.Tags;
foreach (var tag in Tags)
{
if (selectedAutoresHS.Contains(tag.Id.ToString()))
{
if (!DesafioTag.Contains(tag.Id))
{
desafio.Tags.Add(tag);
}
}
else {
if (DesafioTag.Contains(tag.Id))
{
desafio.Tags.Remove(tag);
}
}
}
}
我已经做了很多很多关系的事情来编辑,我做到了,但是在创建方法中它没有用,我觉得这与我的挑战有关,因为我是试图将标签与不存在的挑战相关联,但我不知道原因是什么,这里是我认为这里主要问题的邮政编码 < / p>
{{1}}
如果有人可以帮助我,我是一个初学者,这种关系,我找不到问题。
Ps:抱歉我的英文不好
答案 0 :(得分:0)
您的观点是什么样的。为了提交列表/集合 模型绑定器需要带有id的html元素的东西 &#34; TagDesafio [0] .TagId,TagDesafio 1。TagId&#34;等
查看此帖子了解更多信息: [MVC Form not able to post List of objects
更仔细地检查您的代码后更新了答案。
我现在看到您正在创建一个新的Desafio并将其添加到db-context。然后,您尝试访问与其关联的标记。请填写您是否启用延迟加载或显式加载Tags集合。
查看加载相关实体的文档:https://msdn.microsoft.com/en-us/data/jj574232.aspx
或者,在这种情况下,您可以使用emtpty标记集合实例化Desafio对象:
Desafio desafio = new Desafio();
desafio.Tags = new Collection<Tags>();