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

时间:2013-06-03 21:43:28

标签: 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]
    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执行此操作。我怀疑我只是不知道如何从我的元素数据列表中正确绑定一个项目,但我找不到允许我从列表中选择一个项目的指南。

1 个答案:

答案 0 :(得分:0)

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