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

本文关键字:一个 变量 于外部 绑定 集合 | 更新日期: 2023-09-27 18:16:35

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

假设我有这样一个模型:

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

视图:

@Html.HiddenFor(model => model.ID)
@Html.HiddenFor(model => model.CurrentData.ID)
<header class="editor-header">
    <div class="editor-title">                
        @Html.EditorFor(model => model.CurrentData.Name)
        @Html.ValidationMessageFor(model => model.CurrentData.Name)
    </div>
</header>
<hr />
<div class="editor-field">
    @Html.LabelFor(model => model.CurrentData.Content)
    @Html.EditorFor(model => model.CurrentData.Content)
    @Html.ValidationMessageFor(model => model.CurrentData.Content)
</div>

控制器:

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

我把这些数据返回使用这个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做到这一点。我怀疑我只是不知道如何正确地从我的元素数据列表中绑定一个项目,但我找不到一个指南,允许我从列表中挑选一个单独的项目。

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

答案是创建一个更好的模型。我使用了视图模型并在控制器中解决了这个问题。学课。