C# 值在视图中不显示为已填充
我这里有个奇怪的问题 在Model.cs中:C# 值在视图中不显示为已填充,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我这里有个奇怪的问题 在Model.cs中: public long? ContactoAdditionalId { get; set; } public long Test1 { get; set; } public long? Test2 { get; set; } public string Test3 { get; set; } 在操作结束时视图前的控制器中: [HttpPost] [AllowAnonymous] public
public long? ContactoAdditionalId { get; set; }
public long Test1 { get; set; }
public long? Test2 { get; set; }
public string Test3 { get; set; }
在操作结束时视图前的控制器中:
[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 );
}
最后在View.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 )
(...)
正如您可能已经猜到的,我留下的ContactOaditionAlid带有真实姓名,以防问题值没有出现在视图中
当我在Chrome中按F12打开开发者工具并检查HTML时,ContactOaditionAlid没有值,但有Test1、Test2和Test3的值
注意我用了一个长的,一个长的?和一个字符串来检查问题是否与类型有关,但这三个字符串都在HTML中显示值
当然,这个隐藏字段的目的是在发布时恢复ContactOaditionAlid。这样它就不工作了,它的model属性为null
我还注意到一些奇怪的事情:如果我在视图中添加,就在HiddenFor之前:
@Html.DisplayFor( model => model.ContactoAdditionalId, ... )
它突然起作用了,现在隐藏的字段有了它的价值
这里发生了什么?我在Visual Studio 2017中一步一步地运行调试,当我完成操作代码时,它开始在cshtml视图中进行调试,因此据我所知,没有其他代码,至少我们的项目代码不是在操作之后、视图转换为HTML之前执行的。在ModelState中,您可能有一个参数与未看到数据的参数同名。如果要在模型中更改该值,而没有将其从ModelState中清除,HiddenFor将首先选择ModelState字段。执行ModelState.Clear操作,或仅删除ModelState.remove ContactoAdditionalId字段
另外,您可以使用ModelState.Clear。您可以发布控制器和视图中的完整代码吗?您需要向我们显示更多详细信息,但我假设您在方法中有ContactOaditionAlid的参数,在这种情况下,它与ModelState有关,请参考一个解释,该解释将有大量代码需要复制粘贴,我担心NDA违规,但让我检查您的问题。我将评论控制器并查看我认为与问题无关的代码,并检查问题是否继续存在;如果是这样的话,复制粘贴的次数会减少,NDA.Done的次数也会减少。操作方法只有POST之后传递的模型。但是请注意,问题发生在从一个操作转到另一个视图之后的视图中。正如您所看到的,属性在操作结束时被填充,它成功地填充了Test1、Test2和Test3,但是在呈现的HTML中,我看到ContactOaditionAlid没有被填充,但是Test1、Test2和Test3被填充。