由于发布的数据丢失,MVC模型评估为无效

时间:2013-10-14 01:10:33

标签: c# asp.net-mvc razor

我有一个使用隐藏表单和给定实体模型的所有字段呈现的视图。在某些时候,通过JavaScript,我在这些字段中输入数据并发布表单。

在控制器上,我收到了该实体模型实例的发布数据,但只有一个属性。检查(使用手表)Request.Form,该属性就是正确的名称和值。

可能会发生什么?

以下是一些代码: (查看)

<div id="dvHiddenFormularioPacientePesquisa" style="display:none;">
    @using (Html.BeginForm("ParticipacaoPaciente", "RealizacaoPesquisa", FormMethod.Post, new { @id = "frmPacientePesquisa" }))
    {
        PacientePesquisa PacientePesquisa;
        if (Model.PacientePesquisa != null) { PacientePesquisa = Model.PacientePesquisa; } 
        else 
        { 
            PacientePesquisa = new PacientePesquisa();
            PacientePesquisa.IDPesquisa = Model.Pesquisa.IDPesquisa;
            PacientePesquisa.NRProntuario = Model.Paciente.NRProntuario;
        }

        @Html.HiddenFor(paciente => PacientePesquisa.IDPacientePesquisa)
        @Html.HiddenFor(paciente => PacientePesquisa.IDPesquisa)
        @Html.HiddenFor(paciente => PacientePesquisa.NRProntuario)
        @Html.HiddenFor(paciente => PacientePesquisa.CodSituacaoPacientePesquisa)
        @Html.HiddenFor(paciente => PacientePesquisa.IDMotivoExclusaoIndividuo)
        @Html.HiddenFor(paciente => PacientePesquisa.ObsMotivoExclusao)
    }
</div>

(JS行动)

$('#PacientePesquisa_CodSituacaoPacientePesquisa').val('A'); //Situação do Paciente-Pesquisa: (A)tivo
$('#PacientePesquisa_IDMotivoExclusaoIndividuo').val('');
$('#PacientePesquisa_ObsMotivoExclusao').val('');
$('#frmPacientePesquisa').submit();
return true;

(控制器)

[HttpPost]
public ActionResult ParticipacaoPaciente(PacientePesquisa pacPesq)
{ 
    try
    {
        if (pacPesq.IDPacientePesquisa <= 0) 
        {
            pacPesq.IDUsuario = this.LoggedUser().IDUsuario;
            pacPesq.DataCriacao = DateTime.Now;
        }

        //Limpeza dos erros de validação prévios
        foreach (var modelValue in ModelState.Values)
        {
            modelValue.Errors.Clear();
        }
        //Re-validação do modelo
        ValidateModel(pacPesq); //<== Error here, due to pacPesq.CodSituacaoPacientePesquisa == null, when the posted data value for this attribute is "A"

编辑:

(该领域的实体定义)

public string CodSituacaoPacientePesquisa { get; set; } /* "A" = Ativo / "E" = Excluído */

(观看“Request.Form”)

Request.Form    
{
    PacientePesquisa.IDPacientePesquisa=0
    PacientePesquisa.IDPesquisa=1
    PacientePesquisa.NRProntuario=0000009903
    PacientePesquisa.CodSituacaoPacientePesquisa=A
    PacientePesquisa.IDMotivoExclusaoIndividuo=
    PacientePesquisa.ObsMotivoExclusao=
}   System.Collections.Specialized.NameValueCollection {System.Web.HttpValueCollection}

1 个答案:

答案 0 :(得分:0)

Upod看到你的表单我注意到你的创建视图没有使用模型作为你的强类型视图,而是你似乎使用自定义模型绑定器,这就是为什么当你发布表单时你的控制器没有绑定你的模型视图。如果您仍想保留当前的实施,有两种方法可以做。

数字1解决方案:

将表单集中的每个字段分配给模型类

示例:

pacPesq.CodSituacaoPacientePesquisa=Request.Form["CodSituacaoPacientePesquisa"];
pacPesq.IDMotivoExclusaoIndividuo=Request.Form["IDMotivoExclusaoIndividuo"];

Number 2解决方案:使用CustomModelBinder / Dynamic

要使用CustomModelBinder,请参阅此示例:http://dotnetslackers.com/articles/aspnet/ASP-NET-MVC-Dynamic-Model-Binding.aspx