0

我将 mvc3 与动态创建的表单一起使用,默认的 modelBinder 对我没有帮助。

我想获得对与控制值关联并回发到表单集合中的表单集合键的控制权。

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

目前,这些键是在我不理解支持默认模型绑定的某个地方自动生成的,这对我来说无论如何都不起作用。

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

谢谢

4

2 回答 2

0

表单集合的关键来自输入元素的名称属性。我试图通过使用 html 帮助程序并为 name 属性传入一个值来覆盖它。

像这样:

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

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

由于我的系统是动态的,mvc 无法将数据映射回模型。我想控制该值,以使我能够在发布时手动将数据映射回。

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

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

这允许我在发布时将发布的值挂钩回我的动态结构化模型。

于 2012-06-07T21:06:12.300 回答
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 模板系统将为您处理所有这些,并为您绑定所有内容。您只需要在将模型传递给视图之前正确地实例化您的模型。

于 2012-06-07T04:39:17.190 回答