2

在一个 MVC4 项目中,我使用了一个使用 ViewModel 的部分视图,并且上面有一个 GET 表单。在 Controller 操作中,我希望 ViewModel 对象带有一些数据。当此部分放置在普通 (.cshtml) 视图上时,我通过 Controller 操作中的预期 ViewModel 对象接收数据。但是,当这个部分被放置在另一个部分视图上时,由于某种原因,控制器操作中的 ViewModel 对象是空的。当我逐步创建 HttpGet-form 时,传入的模型不是空的,但是当调用 GET 控制器操作时,模型是。

有谁知道这是什么原因?这是我不知道的一些 MVC 行为吗?谢谢!

部分:

@model ViewModel
    @if (Model != null)
    {
        using (Html.BeginForm("DoSomething", "Home", FormMethod.Get))
        { 
            @Html.HiddenFor(m => m.Object)            
            <input id="btnSend" type="submit"> 
        }
    }

另一部分:

@using OtherViewModel.ViewModel
@Html.Partial("The Partial", Model.ViewModel, ViewData)

风景:

@Html.Partial("_TheOtherPartial", Model.OtherViewModel, new ViewDataDictionary(ViewData) {
                TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "prefix" }
    })

控制器

[HttpGet]
[AllowAnonymous]
public ActionResult DoSomething(ViewModel data)
{
}
4

2 回答 2

5

这里有两件事你应该考虑。首先是尽量不要将表单放在局部视图中。如果你这样做,你可能会得到嵌套表单,浏览器不支持这些表单,因为它不是有效的 HTML

<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM) -- interactive form -->

-(FORM)构造不允许嵌套形式。

第二件事是我建议您使用编辑器模板而不是部分视图看看这里如何使用它们。接下来,正如我之前所说,尝试将表单保留在编辑器模板之外 - 在主视图中使用表单并让编辑器模板呈现页面的不同部分。它将减少混乱并产生更清晰的代码。

在您的具体示例中,它可能如下所示:

主要观点:

@model MainModel
@using (Html.BeginForm("YourAction", "YourController"))
{ 
    @Html.EditorFor(m => m.OtherViewModel)
    <input id="btnSend" type="submit"> 
}

OtherViewModel.cshtml编辑器模板:

@model OtherViewModel
@Html.EditorFor(m => m.ViewModel)

ViewModel.cshtml编辑器模板:

@model ViewModel
@Html.EditorFor(m => m.Object)

主控制器:

public ActionResult YourAction(MainModel data)
{
    ...

楷模:

public class MainModel
{
    public MainModel() { OtherViewModel = new OtherViewModel(); }
    public OtherViewModel OtherViewModel { get; set; }        
}

public class OtherViewModel
{
    public OtherViewModel() { ViewModel = new ViewModel(); }
    public ViewModel ViewModel { get; set; }
}

public class ViewModel
{
    public string Object { get; set; }
}

请注意,模板名称反映了模型类型名称。接下来,将您的模板放在这个~/Views/Shared/EditorTemplates/或这个~/Views/YourController/EditorTemplates/目录下。

于 2013-08-27T09:40:30.847 回答
-1

或者,您可以将与“The View”中获得的原始模型相同的模型传递给“The Other Partial”,然后再传递给“The Partial”,同时仅使用所需部分对应的视图。

于 2013-08-28T05:48:15.237 回答