C# ASP@Html.hidden用于不发布数据

C# ASP@Html.hidden用于不发布数据,c#,asp.net,razor,model,C#,Asp.net,Razor,Model,所以我得到了一个名为BaseModel的简单模型,它具有所有模型所需的属性。比如我的提供者类 public Provider Provider { get; set; } 我有一个SearchModel,它源自BaseModel。它只是有一个额外的字符串和列表 现在,在我的html文件中,我有以下内容: 在顶部,我声明了我的模型: @model SearchModel 在我的页面中,我有这个表格 @using (Html.BeginForm("Search", "Home", FormMet

所以我得到了一个名为
BaseModel
的简单模型,它具有所有模型所需的属性。比如我的
提供者

public Provider Provider { get; set; }
我有一个
SearchModel
,它源自
BaseModel
。它只是有一个额外的字符串和列表

现在,在我的html文件中,我有以下内容:

在顶部,我声明了我的模型:

@model SearchModel
在我的页面中,我有这个表格

@using (Html.BeginForm("Search", "Home", FormMethod.Post))
{
    @Html.EditorFor(model => model.SearchText)
    @Html.HiddenFor(model => model.Provider)

    <button id="BtnSearch" type="submit">Search</button>
}

唯一似乎发生的是,
Provider
在到达我的POST操作时为
null
。奇怪的是,它在过去工作过,我不记得做过任何更改。

“它在过去工作过”
-只有当你有一个非常定制的模型活页夹时,你才应该看看它<代码>提供程序是一个复杂的对象,默认情况下,输出到隐藏表单元素的只是类的名称(除非重写
.ToString()
)。这当然不会反序列化回类的实例。在发送到浏览器的HTML中,隐藏表单字段的实际内容是什么?它转换为
。实际上,字符串
Killer\u App.Helpers.Providers.Provider
并不包含重建类实例的信息。提供程序有多复杂?如果我没记错的话,一个简单的方法就是为其属性创建隐藏字段。例如:
@Html.HiddenFor(model=>model.Provider.SomeField)
等等,这些字段是您希望在
Provider
的请求中持久化的字段。如果变得笨拙,您可以为
提供者
类型创建一个自定义HTML帮助器模板。哦,不
提供者
是一个包含多个对象的对象。我将尝试其他方法。在这种情况下,您可能需要为该类型构建自定义编辑器模板。然后您只需使用@Html.EditorFor()来调用该模板。
public ActionResult Search(SearchModel model)
{
    Session["Provider"] = model.Provider;
    if (!string.IsNullOrEmpty(model.SearchText)) model.Search();
    return View(model);
}