【问题标题】:MVC3 - Pass back a model from RenderPartialMVC3 - 从 RenderPartial 传回模型
【发布时间】:2012-02-27 14:13:30
【问题描述】:

我在 MVC3 中有一个页面,其模型为“pageModel”。

在这个页面我有:

@{ Html.RenderPartial("_subPage", Model.subModel); } (Pagemodel.submodel)

在我的控制器中我正在做:

 [Authorize]
 [AcceptVerbs(HttpVerbs.Post)]
 public ActionResult Results(pagemodel model, string frmAction)
 {
 }

页面第一次加载正常,但是当我回发到httpPost 操作时,model.submodel 始终为空。

我的问题是,如何从 RenderPartial 返回更新的模型(如果有的话)。我可以让我的模型进入局部,但不能返回!

【问题讨论】:

    标签: asp.net-mvc-3 razor


    【解决方案1】:

    partials 的问题是它们不保留导航上下文。这意味着您可能放在此部分中的任何输入字段都将具有不正确的名称,并且默认模型绑定器将无法在您 POST 时检索回值。您的 HTML 将如下所示:

    <input type="text" name="Prop1" value="property 1 value" />
    <input type="text" name="Prop2" value="property 2 value" />
    

    而正确的是:

    <input type="text" name="subModel.Prop1" value="property 1 value" />
    <input type="text" name="subModel.Prop2" value="property 2 value" />
    

    为了获得正确的标记,我建议您使用编辑器模板。

    所以你替换:

    @{ Html.RenderPartial("_subPage", Model.subModel); }
    

    与:

    @Html.EditorFor(x => x.subModel)
    

    然后您将您的 _subPage.cshtml 部分移动到 ~/Views/Shared/EditorTemplates/SubModelType.cshtml 其中 SubModelTypesubModel 属性的类型:

    @model SubModelType
    @Html.EditorFor(x => x.Prop1)
    @Html.EditorFor(x => x.Prop2)
    

    现在,当您查看生成的 HTML 时,相应的输入字段名称应以 subModel 为前缀,并且在 POST 控制器操作中,model.subModel 属性这次将被正确初始化并根据输入的值填充输入字段中的用户。

    【讨论】:

    • 如果我尝试这个,我会在页面上看到System.Data.Objects.DataClasses.RelationshipManagerSystem.Data.Objects.DataClasses.RelationshipManager。我不需要以某种方式告诉编辑使用哪个页面吗?到目前为止,这似乎是正确的做事方式,谢谢
    • @RawryLions,编辑器模板按惯例工作。它在~/Views/Shared/EditorTemplates 文件夹中查找名为SubModelType.cshtml 的文件,其中SubModelType 是主模型上subModel 属性的类型。
    • 啊,现在说得通了。但是,子模型的类型是“IEnumerable”。我以前使用过这种方法进行枚举。我将如何克服这个问题,或者我必须编写另一个模型?
    • @RawryLions,在这种情况下,编辑器模板应称为blah.cshtml 并位于~/Views/Shared/EditorTemplates 文件夹中。由于您的 submodel 属性是一个集合,编辑器模板将自动为集合的每个元素呈现。在这种情况下,输入字段的正确名称将包括索引:name="submodel[0].Prop1" 等等...
    • 谢谢,您的帮助很大。完成此操作后,我将循环通过可枚举类型从部分视图中交换出来,现在它可以正常工作了。 :)
    【解决方案2】:

    您需要更改局部视图以接受顶级模型,即:

    @{ Html.RenderPartial("_subPage", Model); } 
    

    然后它将使用正确的属性名称在局部视图中呈现您的属性,即:

    &lt;input type="text" name="subModel.MyProperty" value="somevalue" /&gt;

    这也意味着您在 HttpPost 操作中返回的模型必须完整地纠正导航关系。

    这只是与视图模型和层次结构相关的警告之一。哦,顺便说一句,在 mvc3 中,您不需要冗长的 [AcceptVerbs(HttpVerbs.Post)] 来发布帖子。你可以简单地使用[HttpPost]

    【讨论】:

    • 我传入了顶级模型并更改了我的子页面以匹配,但是我仍然遇到同样的问题 - 当我检查/观察控制器操作时“model.submodel”为空跨度>
    • 我认为部分视图肯定包含在 beginform {tags} 中?
    【解决方案3】:

    您还可以执行以下操作。

    @Html.RenderPartial(
        "_subPage",
        Model.subModel,
        new ViewDataDictionary
        {
            TemplateInfo = new TemplateInfo
            {
                HtmlFieldPrefix = "subModel"
            }
        });
    

    您的局部视图将保持原样,使用 @model 子模型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多