C# 基于外部变量绑定集合中的一项

C# 基于外部变量绑定集合中的一项,c#,jquery,asp.net-mvc,asp.net-mvc-4,razor,C#,Jquery,Asp.net Mvc,Asp.net Mvc 4,Razor,如果模型上有一组项,如何基于外部变量将一个项绑定到视图中的字段 假设我有这个模型: public class Element { [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public Guid ID { get; set; } public virtual IList<ElementData> Data { get; set; } [NotMapped] pub

如果模型上有一组项,如何基于外部变量将一个项绑定到视图中的字段

假设我有这个模型:

public class Element
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid ID { get; set; }

    public virtual IList<ElementData> Data { get; set; }

    [NotMapped]
    public ElementData CurrentData
    {
        get
        {
            if (Data == null)
                return null;

            ElementData data = Data.FirstOrDefault(x => x.LanguageID == MyContext.Current.Language.ID);
            if (data == null)
                data = Data.FirstOrDefault(x => x.LanguageID == MyContext.Current.DefaultLanguage.ID);

            return data;
        }
    }
}

public class ElementData
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid ID { get; set; }

    [Required]
    [ForeignKey("Element")]
    public Guid ElementID { get; set; }

    [Required]
    [ForeignKey("Language")]
    public Guid LanguageID { get; set; }

    public virtual Element Element { get; set; }
    public virtual Language Language { get; set; }
}
我正在使用此ajax发回此数据:

$(function () {
    $(document).on("submit", "form", function (evt) {
        evt.preventDefault();

        if ($(this).valid()) {
            $.ajax({
                url: this.action,
                type: this.method,
                data: $(this).serialize(),
                success: function (result) {
                    $('#result').html(result);
                }
            });
        }
        return false;
    });
});

该模型在控制器中是有效的,但显然,它不会重新填充我的ElementData列表,因为它不能通过CurrentData执行此操作。我怀疑我只是不知道如何正确地绑定元素数据列表中的一个项目,但我找不到一个指南,允许我从列表中选择一个项目。

这里的答案是创建一个更好的模型。我使用了一个视图模型,并在控制器中解决了这个问题。吸取的教训

[HttpPost]
public string Edit(Element element)
{
    if (ModelState.IsValid)
    {
        db.Entry(element).State = EntityState.Modified;
        db.Entry(element.CurrentData).State = EntityState.Modified; // Exception here as CurrentData is null
        db.SaveChanges();

        return "success";
    }
}
$(function () {
    $(document).on("submit", "form", function (evt) {
        evt.preventDefault();

        if ($(this).valid()) {
            $.ajax({
                url: this.action,
                type: this.method,
                data: $(this).serialize(),
                success: function (result) {
                    $('#result').html(result);
                }
            });
        }
        return false;
    });
});