Как привязать коллекцию форм обратно к объекту пользовательской модели, который использует 2 пользовательских объекта в asp.net mvc? - PullRequest
0 голосов
/ 23 марта 2010

То, что я пытаюсь сделать, довольно просто, но я мог бы перепутать мои факты. У меня есть страница с подробной информацией, которая имеет собственный класс, так как это Model. Пользовательский класс использует 2 пользовательских объекта, а еще один пользовательский объект имеет свойство одного из 2. Страница сведений выводит достаточное количество информации, но позволяет пользователю оставлять комментарии. Когда пользователь нажимает кнопку «Опубликовать», на странице публикуется действие «Подробности», которое выглядит примерно так:

        [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Details(VideoDetailModel vidAndComment) { ....}

Единственными полями в форме, которые публикуются, являются CommentText и VideoId. Вот как выглядит VideoDetailModel.

public class VideoDetailModel
{
    public VideoDetailModel()
    {
        Video = new VideoDTO();
        Comment = new CommentDTO();
    }

    public VideoDetailModel(VideoDTO vid)
    {
        Video = vid;
        Comment = new CommentDTO();
    }

    public VideoDTO Video { get; set; }
    public CommentDTO Comment { get; set; }
}

VideoDTO имеет несколько свойств, но мне нужны VideoId. К соответствующим свойствам CommentDTO относятся CommentText (который публикуется правильно) и объект UserDTO, который содержит свойство userId. Все, кроме значения CommentText, не публикуется. У меня также есть следующая строка на странице ascx, но значение модели никогда не публикуется в контроллере.

Html.Hidden("Model.Video.VideoId", Model.Video.VideoId);       

Я действительно не уверен, что мне здесь не хватает. Я полагаю, что если бы я добавил больше полей формы для нужных мне свойств, они были бы опубликованы, но мне нужно только 1 поле ввода формы для CommentText. Если бы я мог получить то же значение объектов Model, которое было отправлено на страницу для публикации на странице, это помогло бы.

Я буду рад сделать любые разъяснения, необходимые здесь. Я просто в растерянности относительно того, что происходит.

UPDATE

Хорошо, похоже, решение довольно простое. Я думаю, что использование RenderPartial в середине формы проблематично из-за того, как форма записывается в html. Я не могу понять, почему все пошло не так, но если я сделаю свои RenderPartials перед своей формой, а затем начну свою форму с поля ввода текста и скрытого VideoId, ModelBinder по умолчанию будет работать нормально. Я начинал форму, писал скрытый VideoId, рендерил несколько частичных представлений, создавал поле CommentText, а затем закрывал форму. Поле CommentText будет очень хорошо связано. Скрытый VideoId не будет. Возможно, я где-то пропустил правило об использовании RenderPartial.

Для полноты, частичное представление, которое я рендерил, взял объект Comment и просто записал его данные CommentText. Некоторые из этих объектов будут существовать для одного объекта Video. Все эти данные были в пользовательском типе и переданы в представление (основной вид) как его модель. Это частичное представление не имело формы и не содержало полей для ввода данных.

Ответы [ 2 ]

1 голос
/ 23 марта 2010

Мне нужно увидеть больше кода вашей страницы просмотра, чтобы действительно дать здесь исчерпывающий ответ, но для одного размещенного вами фрагмента:

Html.Hidden("Model.Video.VideoId", Model.Video.VideoId);

На самом деле должно быть:

Html.Hidden("Video.VideoId", Model.Video.VideoId);

или

Html.Hidden("vidAndComment.Video.VideoId", Model.Video.VideoId);

В любом случае будет работать, но я предпочитаю первый, если действие вашего контроллера принимает только один параметр.Связыватель модели по умолчанию будет (в вашем примере) искать параметр метода с именем «Model» или не сможет найти свойство «Model» в вашем классе VideoDetailsModel.Поскольку ни один из них не существует, он не может привязать «Model.Video.VideoId» ни к чему.

0 голосов
/ 23 марта 2010

Есть ли на вашем сайте mvc какая-либо модель привязки безопасности? Чтобы объяснить, что я имею в виду, посмотрите на эту страницу и прочитайте раздел в конце, озаглавленный «Безопасность привязки модели». Обратите внимание, что это может быть в вашем коде ИЛИ в вашем файле global.asax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...