多对多值为null

时间:2016-05-29 08:38:40

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我试图与我的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:抱歉我的英文不好

1 个答案:

答案 0 :(得分:0)

  

您的观点是什么样的。为了提交列表/集合   模型绑定器需要带有id的html元素的东西   &#34; TagDesafio [0] .TagId,TagDesafio 1。TagId&#34;等

     

查看此帖子了解更多信息:   [MVC Form not able to post List of objects

     

[2]:   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>();