值未显示在视图中

时间:2018-09-10 13:14:04

标签: c# asp.net-mvc razor

我在这里有一个奇怪的问题。

在模型(.cs)中:

    public long? ContactoAdditionalId { get; set; }
    public long Test1 { get; set; }
    public long? Test2 { get; set; }
    public string Test3 { get; set; }

在Controller中(在操作之前,在视图之前):

    [HttpPost]
    [AllowAnonymous]
    public ActionResult Index( Contacto model )
    {
        DoSomeStuff( model, ... );

        (...)

        model.Test1 = model.ContactoAdditionalId.HasValue ? model.ContactoAdditionalId.Value : -1;
        model.Test2 = model.ContactoAdditionalId;
        model.Test3 = model.ContactoAdditionalId.HasValue ? model.ContactoAdditionalId.Value.ToString() : "No value!";
        return View( model );
    }

最后在视图(.cshtml)中:

@using MyApp.Models;

@model Contacto

@using ( Html.BeginForm( "Index", "Contacto" ) )
{
    @Html.HiddenFor( model => model.ContactoAdditionalId )
    @Html.HiddenFor( model => model.Test1 )
    @Html.HiddenFor( model => model.Test2 )
    @Html.HiddenFor( model => model.Test3 )
    (...)

您可能已经猜到了,View中出现的ContactoAdditionalId(如果是那个的话,我会留下真实姓名)值为。< / p>

当我在Chrome中按F12打开开发人员工具并检查HTML时, ContactoAdditionalId没有值,但是Test1,Test2和测试3。

请注意,我用了很长时间?和一个字符串来检查问题是否与类型有关,但是所有三个都在HTML中显示值。

当然,此隐藏字段的目的是在发帖时取回ContactoAdditionalId。这样就无法正常工作,并且其model属性为null!

我还注意到了一些奇怪的事情:如果我将视图添加到HiddenFor之前,

@Html.DisplayFor( model => model.ContactoAdditionalId, ... )

它突然起作用,现在隐藏的字段中有值!

这是怎么回事?我在Visual Studio 2017中逐步进行了调试,当我到达动作代码结尾时,它开始单步进入cshtml视图,因此没有其他代码(据我所知,至少不是我们项目的代码)在动作之后和视图以HTML转换之前被执行。

1 个答案:

答案 0 :(得分:1)

您可能在ModelState中有一个名称与您看不到数据的名称相同的参数。如果要在Model中更改该值,而没有从ModelState中清除该值,则HiddenFor将首先选择ModelState字段。请执行ModelState.Clear()或仅删除具有ModelState.Remove(“ ContactoAdditionalId”)“的字段

此外,您可以使用ModelState.Clear()。