Любой способ включить наблюдаемые значения knockoutjs в стандартную форму сообщения MVC? - PullRequest
2 голосов
/ 13 марта 2012

Я использую ASP.NET 4, MVC3, EF 4.3 (сначала код) и нокаут JS.В настоящее время я работаю над созданием и редактированием форм для одной из моих более сложных моделей.К нему прикреплены различные поля, а также несколько коллекций для связанных объектов (многие ко многим).Я задам свой вопрос для сценария редактирования, поскольку он сложнее двух.

Я бы хотел, чтобы пользователь мог редактировать все поля модели, которые я поместил вViewModel.Для отображения и добавления дополнительных умений (одной из коллекций «многие ко многим») я решил с большим эффектом использовать knockoutjs, который прекрасно отображает сериализованные начальные объекты коллекции, а также позволяет добавлять больше.

Моя проблема в том, как сохранить эту довольно сложную модель, отправив ее обратно в контроллер.Поскольку многие из моих полей могут быть представлены в виде стандартными помощниками HTML, я бы хотел избежать нескольких записей AJAX или привязки каждого отдельного поля к ko.observable (массиву).Что я действительно хочу, так это взять только коллекции «многие ко многим», связать их с ko.observablearrays и каким-то образом отправить их обратно как часть стандартного строго типизированного сообщения формы представления mvc.

Возможно ли это вообще??И если так, как бы я подошел к этому?Буду очень признателен за любую помощь, мои исследования пока не дали никаких полезных результатов.Готов опубликовать фрагменты кода, если это поможет лучше описать проблему.

edit: образец viewmodel для формы редактирования по запросу

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

1 Ответ

2 голосов
/ 15 марта 2012

Я бы не советовал делать это таким образом, но если вы чувствуете, что должны опубликовать форму.Почему бы просто не сериализовать коллекцию как JSON в скрытое поле формы.

<input name="something" type="hidden" data-bind="text: collectionToJson" />

Ваш метод collectionToJson вызовет ko.toJSON или эквивалент преобразования, и тогда вам придется самостоятельно обрабатывать десериализацию на стороне сервера.

Я не думаю, что вы пытаетесь найти хороший чистый способ отправить сообщение обратно через форму AND model bind.На вашем месте я бы связал всю форму с моделью json и отправил обратно полностью правильно сформированный объект json для автоматического связывания модели.ИМХО, результирующий код на стороне сервера будет намного чище.

Надеюсь, это поможет.

...