mvc3 - 覆盖formcollection键

时间:2012-06-06 21:37:52

标签: asp.net-mvc-3 dynamic formcollection

我正在使用mvc3和动态创建的表单,默认的modelBinder并没有帮助我。

我希望控制与控件值关联的表单集合键,并将其发布回表单集合中。

controllerContext.HttpContext.Request.Form["IWantToSetThisKeyRightHere"]

目前这些密钥是在某些我无法理解的地方自动生成的,以支持默认的模型绑定,但这对我来说无效。

如何在创建视图时设置这些值,以便我可以尝试使用自己的自定义模型绑定器在发布动态表单时提取数据?

由于

2 个答案:

答案 0 :(得分:0)

根据您之前的问题,您的问题似乎并不那么复杂。你做得比它要难得多。您只需要一个简单的模型,如下所示:

public class Container {
    public List<Container> Containers {get;set;}
    public Question Question {get;set;}
}

public class Question {
    public List<Answer> Answers {get;set;}
}

在这里猜测,答案可能不能包含任何内容,因此它需要自己的对象,而问题只能包含答案。如果一个问题可以包含其他问题或容器,那么您可以稍微修改一下以使其有效。

这些都不需要特殊的模型装订器。

您不需要从单个基础继承所有对象,也不需要使用奇怪的模板选择器。

您可以通过以下方式执行此操作:

EditorTemplates / Container.cshtml

@model Container

@Html.EditorFor(m => m.Containers)
@Html.EditorFor(m => m.Question)

EditorTemplates / Question.cshtml

@model Question

@Html.EditorFor(m => m.Answers)

EditorTemplates / Answer.cshtml

@model Answer

// whatever your answer code is.. if you have multiple answer types then you 
// need a template for each type

默认的MVC模板系统将为您处理所有这些,并且模型为您绑定所有内容。您只需在将模型传递给视图之前正确实例化模型。

答案 1 :(得分:0)

表单集合的关键来自input元素的name属性。 我试图通过使用html帮助器并为name属性传入 new 值来覆盖它。

像这样:

@{ var uniqueNameAttribute = new { name = Model.UniqueName };}   
@Html.TextBox(Model.MessageText, Model.Answer, uniqueNameAttribute)

我试图设置的名称值(Model.UniqueName)被一个字符串覆盖,该字符串可能是由mvc设计的,以允许它在帖子之后的modelBinding中将值映射回同一个Model类。

由于我的系统是动态的,因此mvc无法将数据映射回模型。我希望控制该值以使我能够在帖子上将数据映射回手动

解决方案非常简单,我所要做的就是使用@ Html.TextBox助手生成文本框,并使用我想要的名称属性自己创建它。

<input type="text" class="vmFreeTextAnswer" name="@Model.UniqueName" value="" />

这允许我将发布的值挂钩到帖子上的动态结构化模型中。