在标准mvc表单帖子中包含knockoutjs可观察值的任何方式

Any way to include knockoutjs observable values in standard mvc form post?

本文关键字:任何方 何方 观察 表单 mvc 标准 knockoutjs 包含      更新时间:2023-09-26

我使用的是ASP.NET 4、MVC3、EF 4.3(代码优先)和敲除JS。我目前正在为我的一个更复杂的模型创建和编辑表单。它附加了各种字段,以及相关对象的几个集合(多对多)。我将为编辑场景提出我的问题,因为这是两者中较难的一个。

我希望用户能够编辑模型的所有字段,我已经将这些字段放入视图模型中。为了显示和添加额外的技能(多对多集合中的一个),我决定使用knockoutjs来达到很好的效果,它可以很好地显示集合的序列化初始对象,并允许我添加更多。

我的问题是如何通过将这个相当复杂的模型发送回控制器来保存它。由于我的许多字段可以在视图中由标准的HTML助手很好地表示,我希望避免多个AJAX帖子或将每个字段绑定到一个ko.observabrarray(数组)。我真正想要的是只使用多对多集合,将它们绑定到ko.obsservabrarrays,并以某种方式将它们作为标准强类型mvc视图表单帖子的一部分发送回来。

这可能吗?如果是这样的话,我该如何处理呢?我真的很感激任何帮助,我的研究到目前为止还没有产生任何有用的结果。如果这有助于更好地描述问题,我愿意发布代码摘要。

edit:根据要求编辑表单的示例视图模型

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或等效的映射,然后您必须自己在服务器端处理反序列化。

我不认为你这样做是为了找到一种通过表单AND模型绑定返回的干净方法。如果我是你,我会将整个表单绑定到一个json模型,并发布一个完整的格式良好的json对象用于自动模型绑定。服务器端的结果代码将是更干净的IMHO。

希望这能有所帮助。