2015-07-10 37 views
0

我有这样的情况:开始形式不提交继承视图模型ASP.NET MVC4

[Serializable] 
public class FormBuscarCorteReligacaoViewModel 
{ 
    public CorteReligacao CorteReligacao { get; set; } 
} 

[Serializable] 
public class OrdensFinalizadasViewModel : FormBuscarCorteReligacaoViewModel 
{ 
    public Manutencao Manutencao { get; set; } 
    public DateTime? DataInicio { get; set; } 
    public DateTime? DataFim { get; set; } 

    public OrdensFinalizadasViewModel() 
    { 
    } 
} 

所以在这里我的孩子是OrdensFinalizadasViewModel。我有这样的:

@model ProjetoPath.OrdensFinalizadasViewModel 

@using (Html.BeginForm("Buscar", "OrdensFinalizadas", FormMethod.Post, new { id = "FormBuscarOrdensFinalizadas" })) 
{ 
    @Html.Partial("~/Views/Shared/_FormBusca.cshtml", Model) 
} 

而且我的控制器:

[HttpPost] 
    public ActionResult Buscar(OrdensFinalizadasViewModel modelOrdensFinalizadas) 
    { 
     //DO STUFF 
    } 

我要的是能够访问的FormBuscarCorteReligacaoViewModelCorteReligacao。但它的唯一填充OrdensFinalizadasViewModel属性。

我的看法~/Views/Shared/_FormBusca.cshtml

@using Capgemini.Telemetria.STCortes.Domain.ViewModel.Common 
@model Capgemini.Telemetria.STCortes.Domain.ViewModel.Common.FormBuscarCorteReligacaoViewModel 

@{ 
    var modelOrdensFinalizadas = Model as ProjectPath.OrdensFinalizadasViewModel; 
} 

<table class="tabela_filtro" style="border: 1px solid #ccc; margin-bottom: 5px; font-size: 11px" /> 
<thead> 
[...] 
</thead> 
<tbody> 
    @if(modelOrdensFinalizadas != null) 
    { 
     <tr> 
      <td> 
       <label> 
        Data 
       </label> 
      </td> 
      <td> 
       @Html.TextBoxFor(model => modelOrdensFinalizadas.DataInicio, new { id = "dataInicio", @class = "campoData", @placeholder = "Data Inicio" }) 
      </td> 
      [...] 
     </tr> 
    } 
    <tr> 
     <td> 
      <label class="label_filtro"> 
       CP 
      </label> 
     </td> 
     <td> 
      @Html.EditorFor(model => model.CorteReligacao.CoreCp, new { style = "width: 20px;" }) 
      <span class="validation-message">@Html.ValidationMessageFor(model => model.CorteReligacao.CoreCp)</span> 
     </td> 
     [...] 
      <input type="image" src="~/Content/img/icons/enviar.gif" value="Buscar" title="Buscar" /> 
     </td> 
    </tr> 
</tbody> 

是否有可能做到这一点?我有点新的asp.net MVC。 希望任何帮助/消化。

问候

回答

1

在你看来,你告诉它你的模型是类型FormBuscarCorteReligacaoViewModel。如果您更改到

@using Capgemini.Telemetria.STCortes.Domain.ViewModel.Common 
@model Capgemini.Telemetria.STCortes.Domain.ViewModel.Common.OrdensFinalizadasViewModel 

,并删除这部分

@{ 
    var modelOrdensFinalizadas = Model as ProjectPath.OrdensFinalizadasViewModel; 
} 

,你应该能够使用

@Html.EditorFor(model => model.CorteReligacao.CoreCp, new { style = "width: 20px;" }) 

您需要将您textboxfor改变

@Html.TextBoxFor(model => model.DataInicio, new { id = "dataInicio", @class = "campoData", @placeholder = "Data Inicio" }) 

你有没有尝试添加c你的模型的入侵者初始化孩子的属性?

[Serializable] 
public class FormBuscarCorteReligacaoViewModel 
{ 
    public FormBuscarCorteReligacaoViewModel() 
    { 
     CorteReligacao = new CorteReligacao(); 
    } 
    public CorteReligacao CorteReligacao { get; set; } 
} 

[Serializable] 
public class OrdensFinalizadasViewModel : FormBuscarCorteReligacaoViewModel 
{ 
    public Manutencao Manutencao { get; set; } 
    public DateTime? DataInicio { get; set; } 
    public DateTime? DataFim { get; set; } 

    public OrdensFinalizadasViewModel() 
     : base() 
    { 
     Manutencao = new Manutencao(); 
    } 
} 
+0

嘿,哥们。感谢您的回答!不过,我已经可以使用“父亲”实体访问“CorteReligacao”。问题是,每当我尝试发布孩子和父亲时,孩子对象在控制器端都会收到null。 –

+0

多数民众赞成在一个奇怪的..我添加了一个建议,添加构造函数,但并不总是工作.. – user5103147

+0

你''base()'是redudant ....我仍然尝试,但没有奏效。然而,我尝试在控制器方法上添加一个新的参数:'公共ActionResult Buscar(OrdensFinalizadasViewModel modelOrdensFinalizadas,CorteReligacao corteReligacao)'和'CorteReligacao'得到填充,但不是作为'OrdensFinalizadasViewModel'的孩子' –

0

肯定是可能的,只是我建议你几个变化

第一: 从局部视图中删除

  @{ 
     var modelOrdensFinalizadas = Model as   ProjectPath.OrdensFinalizadasViewModel; 
     } 

改变了这种从局部到您的视图,并从部分删除,将modelOrdensFinalizadas重命名为Model,

 <table class="tabela_filtro" style="border: 1px solid #ccc; margin-bottom: 5px; font-size: 11px" /> 
     <thead> 

     [...] 

    </thead> 
    <tbody> 
     @if(Model!= null) 
     { 
    <tr> 
     <td> 
      <label> 
       Data 
      </label> 
     </td> 
     <td> 
      @Html.TextBoxFor(model => Model.DataInicio, new { id = "dataInicio", @class = "campoData", @placeholder = "Data Inicio" }) 
     </td> 
     [...] 
    </tr> 
} 
<tr> 
    //here your partial view 
    @Html.Partial("~/Views/Shared/_FormBusca.cshtml", Model) 
      </tr> 
    </tbody> 

然后在您的局部视图只是把你需要

<td> 
     <label class="label_filtro"> 
      CP 
     </label> 
    </td> 
    <td> 
     @Html.EditorFor(model => model.CorteReligacao.CoreCp, new { style = "width: 20px;" }) 
     <span class="validation-message">@Html.ValidationMessageFor(model => model.CorteReligacao.CoreCp)</span> 
    </td> 
    [...] 
     <input type="image" src="~/Content/img/icons/enviar.gif" value="Buscar" title="Buscar" /> 
    </td> 

,现在的表Resto餐厅在你控制器,你将有机会获得模型(OrdensFinalizadasViewModel和FormBuscarCorteReligacaoViewModel)

你得到你空控制器,因为

@Html.TextBoxFor(model => modelOrdensFinalizadas.DataInicio 

不在局部视图的模型(FormBuscarCorteReligacaoViewModel)的一部分

希望这可以帮助你,或者至少给你一个想法