我正在使用 ASP.NET 4、MVC3、EF 4.3(代码优先)和 knockout JS。我目前正在为我的一个更复杂的模型创建和编辑表单。它附加了各种字段,以及相关对象的多个集合(多对多)。我将针对编辑场景提出我的问题,因为这是两者中较难的一个。
我希望用户能够编辑我已放入 View 模型中的模型的所有字段。为了显示和添加额外的技能(多对多集合之一),我决定使用 knockoutjs 来达到很好的效果,它可以很好地显示集合的序列化初始对象,并允许我添加更多。
我的问题是如何通过将其发送回 Controller 来保存这个相当复杂的模型。由于我的许多字段都可以通过标准 HTML 帮助器很好地在 View 中表示,因此我希望避免多个 AJAX 帖子或将每个字段绑定(bind)到 ko.observable(array)。我真正想要的是只获取多对多集合,将它们绑定(bind)到 ko.observablearrays,并以某种方式将它们作为标准强类型 mvc View 表单帖子的一部分发送回来。
这可能吗?如果是这样,我将如何处理它?我真的很感激任何帮助,到目前为止我的研究还没有产生任何有用的结果。如果有助于更好地描述问题,我愿意发布代码片段。
编辑:根据要求编辑表单的示例 View 模型
namespace MyProject.Models
{
[NotMapped]
public class JobViewModel
{
public int JobID { get; set; }
[Required]
public string Title { get; set; }
[Required]
public string Description { get; set; }
[Display(Name = "Start Date")]
[DataType(DataType.Date)]
public DateTime StartDate { get; set; }
[Display(Name = "End Date")]
[DataType(DataType.Date)]
public DateTime EndDate { get; set; }
// Foreign Keys
[Display(Name = "Hiring Manager")]
[Required]
public string HiringManagerID { get; set; }
[Display(Name = "Assigned User")]
public string AssignedUserID { get; set; }
//Collections for many-to-many properties
public List<JobSkillViewModel> JobSkills { get; set; }
}
}
以及我的 ViewModel 保存在集合中:
namespace MyProjectModels
{
[NotMapped]
public class JobSkillViewModel
{
public int SkillID { get; set; }
public int LevelID { get; set; }
public string SkillName { get; set; }
public string LevelDescription { get; set; }
}
}
最佳答案
我不建议这样做,但如果您觉得必须使用表单发布。为什么不简单地将集合作为 JSON 序列化到隐藏的表单字段中。
<input name="something" type="hidden" data-bind="text: collectionToJson" />
您的 collectionToJson 方法将调用 ko.toJSON
或等效映射,然后您必须自己在服务器端处理反序列化。
我不认为您正在寻找一种干净的方式来通过表单和模型绑定(bind)发回。如果我是你,我会将整个表单绑定(bind)到 json 模型,并回发完整的格式良好的 json 对象以进行自动模型绑定(bind)。恕我直言,服务器端的最终代码会更加简洁。
希望这有帮助。
关于javascript - 有什么方法可以在标准 mvc 表单帖子中包含 knockoutjs 可观察值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9686589/