代码之家  ›  专栏  ›  技术社区  ›  jason

如何将表单集合绑定回使用ASP.NET MVC中2个自定义对象的自定义模型对象?

  •  0
  • jason  · 技术社区  · 16 年前

    我想做的是相当基本的,但我可能把事实弄混了。我有一个详细信息页面,它有一个自定义类作为模型。自定义类将2个自定义对象与另一个自定义对象(2个对象中的一个属性)一起使用。详细信息页面输出了大量信息,但允许用户发表评论。当用户单击“发布”按钮时,页面将被发布到类似以下内容的详细信息操作:

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

    表单上唯一发布的字段是CommentText和VideoID。这是视频细节模型的样子。

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

    我真的不知道我在这里遗漏了什么。我想如果我为我需要的属性添加更多的表单字段,它们就会被发布,但是我只需要一个表单条目字段作为注释文本。如果我能得到相同的模型对象值,这些值被发送到页面,以便与页面一起发布,那将是有帮助的。

    我很乐意在此澄清任何需要的问题。我对所发生的事一无所知。

    更新

    好的,看起来解决方案相当简单。我认为在表单中间使用renderpartial在某种程度上对如何用HTML编写表单是有问题的。我不能确定为什么会出现问题,但是如果我在窗体前执行renderparties,然后以文本输入字段和隐藏的videoid开始窗体,那么默认的modelbinder就可以正常工作了。我开始创建表单,编写隐藏的videoid,呈现几个部分视图,创建我的commenttext字段,然后关闭表单。CommentText字段将被绑定。隐藏的videoid不会。也许我错过了使用renderpartial的规则。

    为了完整性,我呈现的部分视图获取了一个注释对象,并刚刚写出了它的注释文本数据。对于单个视频对象,这些对象中的一些将存在。所有这些数据都是自定义类型的,并作为模型传递到视图(主视图)中。此部分视图没有窗体,也没有任何数据输入字段。

    2 回复  |  直到 16 年前
        1
  •  1
  •   David Archer Chris Spicer    16 年前

    我需要看到更多的视图页面代码才能在这里给出一个完整的答案,但对于您发布的一个片段:

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

    应该是:

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

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

    任何一种方法都可以,但是如果控制器操作只采用一个参数,我倾向于使用第一个。默认的模型绑定器(在您的示例中)将查找名为“model”的方法参数,如果失败,则将查找VideoDetailsModel类上的属性“model”。因为两者都不存在,所以它无法将“model.video.videoid”绑定到任何内容。

        2
  •  0
  •   Jaxidian    16 年前

    您的MVC站点中是否实现了模型绑定安全性?为了解释我的意思,看看 this page 并阅读结尾处题为“模型绑定安全性”的部分。请注意,这可以在代码或global.asax文件中进行。

    推荐文章