Asp.net mvc 3 使用AJAX和验证的MVC3复杂模型绑定-获取动态图
假设我有一些类似于以下内容的模型对象:Asp.net mvc 3 使用AJAX和验证的MVC3复杂模型绑定-获取动态图,asp.net-mvc-3,Asp.net Mvc 3,假设我有一些类似于以下内容的模型对象: public class FooModel { [Required] public string Name { get; set; } [StringLength(100)] public string Description { get; set; } public bool HasBar { get; set; } public BarModel Bar { get; set; } } public c
public class FooModel
{
[Required]
public string Name { get; set; }
[StringLength(100)]
public string Description { get; set; }
public bool HasBar { get; set; }
public BarModel Bar { get; set; }
}
public class BarModel
{
[Required]
public string Name { get; set; }
[StringLength(100)]
public string Description { get; set; }
public bool HasWidgets { get; set; }
public IEnumerable<WidgetModel> Widgets { get; set; }
}
public class WidgetModel
{
[Required]
public string Name { get; set; }
[StringLength(100)]
public string Description { get; set; }
public string Type { get; set; }
public bool Active { get; set; }
}
公共类模型
{
[必需]
公共字符串名称{get;set;}
[长度(100)]
公共字符串说明{get;set;}
公共布尔HasBar{get;set;}
公共模型条{get;set;}
}
公共类模型
{
[必需]
公共字符串名称{get;set;}
[长度(100)]
公共字符串说明{get;set;}
公共bool haswidget{get;set;}
公共IEnumerable小部件{get;set;}
}
公共类WidgetModel
{
[必需]
公共字符串名称{get;set;}
[长度(100)]
公共字符串说明{get;set;}
公共字符串类型{get;set;}
公共bool活动{get;set;}
}
我想为FooModel
构建一个视图,在选中HasBar
输入时,该视图将加载Bar
的部分视图,并完成验证(不引人注目)。如果选中了Bar
的haswidget
,它将加载一个局部视图,其中包含一个用于将WidgetModel
类型的项添加到表单数据的界面
单击表单的提交按钮时,我希望将完整的图形传递给控制器
我想我可以用编辑器模板做类似的事情,但是我的子对象没有被命名为可以作为图形的一部分进行解析的方式(我希望是因为它们是在事实之后添加的,并且不知道它们是更大模型的一部分)
是否有一种机制/模式来支持这类事情?我知道这有点递归,但我必须重新设计轮子才能正确命名所有内容吗?如果您的UI允许此解决方案,我建议您首先将所有模型加载到视图中,但要隐藏“Bar”(以及“Widget”)部分(使用CSS隐藏)。然后使用JavaScript/jQuery显示它们 即使“Bar”需要根据“Foo”属性值加载数据(而“Widget”需要根据“Bar”加载数据),在第一步加载所有元素,然后通过Javascript或AJAX调用填充它们总是比较容易的。创建以下内容:
- 返回BarModel的操作
- 返回WidgetModel的操作
- 接受整个图形或任何主对象的操作
public JsonResult GetBar(string name)
{
var bar = //get bar
return Json(bar);
}
public JsonResult GetWidget(string name)
{
var widget = //get widget
return Json(widget);
}
[HttpPost]
public ActionResult SaveGraph(GraphModel graph)
{
// save graph.Bar
// save graph.Widget
// save graph.Foo
return ViewResult(graph); // or redirect, JSON, etc.
}
在客户机上,无论原始viewmodel是什么,都可以创建和发布对象
var graph = { Bar: { ... },
Foo: { ... },
Widget: { ... }
}
$.ajax({ url: '/mycontroller/savegraph',
method: 'post',
data: graph,
success: function(resp) {
// yay!
}
});
这是一种合法的方法;不过我更喜欢动态地做。这是我遇到的一个小例子,其中有几十个复杂对象,每个都有自己的复杂对象。。。如果可能的话,我只想加载必要的内容。我仍然不确定您是否在寻找:1。类似于
Generic EditorTemplate
的东西,支持任何类型的模型;或2。这只是在主视图中加载不同视图的一种方法。看看这是否是您的答案:如果不是,请提供一个简短的示例,说明您希望您的视图看起来如何。它可以帮助我理解你。我决定用简单的方法。看起来这是可行的,但我决定把它全部放在表格上并隐藏div就不会那么痛苦了。谢谢