我在这里有一个奇怪的问题。
在模型(.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转换之前被执行。
答案 0 :(得分:1)
您可能在ModelState中有一个名称与您看不到数据的名称相同的参数。如果要在Model中更改该值,而没有从ModelState中清除该值,则HiddenFor将首先选择ModelState字段。请执行ModelState.Clear()或仅删除具有ModelState.Remove(“ ContactoAdditionalId”)“的字段
此外,您可以使用ModelState.Clear()。