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