ste*_*jnl 2 c# partial-views viewmodel asp.net-mvc-4
在MVC4项目中,我使用部分视图,即使用ViewModel并在其上具有GET Form。在Controller动作中,我希望ViewModel对象包含一些数据。当此部分放置在普通(.cshtml)视图上时,我通过Controller操作中的预期ViewModel对象接收了数据。但是,将此部分放置在另一个部分视图上时,由于某种原因,控制器操作中的ViewModel对象为空。当我逐步完成HttpGet表单的创建时,传入的模型不是空的,但是当调用GET控制器操作时,该模型为空。
有人知道原因吗?这是我不知道的某些MVC行为吗?谢谢!
部分:
@model ViewModel
@if (Model != null)
{
using (Html.BeginForm("DoSomething", "Home", FormMethod.Get))
{
@Html.HiddenFor(m => m.Object)
<input id="btnSend" type="submit">
}
}
Run Code Online (Sandbox Code Playgroud)
其他部分:
@using OtherViewModel.ViewModel
@Html.Partial("The Partial", Model.ViewModel, ViewData)
Run Code Online (Sandbox Code Playgroud)
风景:
@Html.Partial("_TheOtherPartial", Model.OtherViewModel, new ViewDataDictionary(ViewData) {
TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "prefix" }
})
Run Code Online (Sandbox Code Playgroud)
控制器
[HttpGet]
[AllowAnonymous]
public ActionResult DoSomething(ViewModel data)
{
}
Run Code Online (Sandbox Code Playgroud)
这里有两件事您应该考虑。第一种是尽量不要将表单放在部分视图中。如果这样做,最终可能会导致嵌套表单,浏览器不支持嵌套表单,因为它不是有效的HTML:
<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM) -- interactive form -->
Run Code Online (Sandbox Code Playgroud)
-(FORM) 构造不允许嵌套形式。
第二件事是代替部分视图,我建议您使用编辑器模板。在这里看看如何使用它们。接下来,正如我之前所说,尝试将表单保留在编辑器模板之外-在主视图中使用表单,并让编辑器模板呈现页面的不同部分。它将减少混乱,并产生更清晰的代码。
在您的特定示例中,它可能如下所示:
主要观点:
@model MainModel
@using (Html.BeginForm("YourAction", "YourController"))
{
@Html.EditorFor(m => m.OtherViewModel)
<input id="btnSend" type="submit">
}
Run Code Online (Sandbox Code Playgroud)
OtherViewModel.cshtml 编辑器模板:
@model OtherViewModel
@Html.EditorFor(m => m.ViewModel)
Run Code Online (Sandbox Code Playgroud)
ViewModel.cshtml 编辑器模板:
@model ViewModel
@Html.EditorFor(m => m.Object)
Run Code Online (Sandbox Code Playgroud)
主控制器:
public ActionResult YourAction(MainModel data)
{
...
Run Code Online (Sandbox Code Playgroud)
楷模:
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; }
}
Run Code Online (Sandbox Code Playgroud)
请注意,模板名称反映了模型类型名称。接下来,将模板放在~/Views/Shared/EditorTemplates/此~/Views/YourController/EditorTemplates/目录下。
| 归档时间: |
|
| 查看次数: |
5400 次 |
| 最近记录: |