在局部视图中用作模型的对象会在控制器中创建另一个模型

本文关键字:模型 控制器 创建 另一个 对象 局部 视图 | 更新日期: 2023-09-27 18:12:26

我的应用程序发生了一些奇怪的事情。它不会损坏,但这是一种奇怪的行为,我联系你来了解发生了什么。

我正在做一些基于模型的局部视图,它工作了。我发现我必须用正确的输入替换很多东西。

这是我的旧模型的一个片段:

public class SearchObjInfo
{
    public string m_ObjName { get; set; }
    public string m_ObjType { get; set; }
    public decimal? m_ObjNumber { get; set; }
    public string m_ObjSymbol { get; set; }
    public string m_ObjPower { get; set; }
}

下面是我为构造这个分部视图而创建的新类的相同代码片段:

public class SearchObjInfoPartial
{
    public string m_ObjName { get; set; }
    public IEnumerable<SelectListItem> m_ObjType { get; set; }
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:0}")]
    public int m_ObjNumber { get; set; }
    public IEnumerable<SelectListItem> m_ObjPower { get; set; }
    public IEnumerable<SelectListItem> m_ObjSymbol { get; set; }
}

现在渲染的方式是完全相同的,而不是。我以前用过很多这样的东西:

<label>
    Text: Write a name, part of a name, or a word.
</label>
Object Name: @Html.TextBox("_objectName") <br/>
Object Number: <input type="number" min="0" max="9999" name="_objNumber" value="decimal" style="width: 70px"/><br/>
Type: @Html.DropDownList("_objType", "All") <br/>
Power: @Html.DropDownList("_objSymbol", "=") @Html.DropDownList("_objValue", String.Empty)<br/>

但是现在我这样渲染我的局部视图:

@model MyApp.Utilities.SearchObjInfoPartial
Object Name: @Html.TextBoxFor(item => item.m_ObjName, Model.m_ObjName, String.Empty) <br/>
Object Number: @Html.EditorFor(item => item.m_ObjNumber)<br />
Power: @Html.DropDownListFor(item => item.m_ObjPower, Model.m_ObjPower, String.Empty)      @Html.DropDownListFor(item => item.m_ObjSymbol, Model.m_ObjSymbol, String.Empty)
Type: @Html.DropDownListFor(item => item.m_ObjType, Model.m_ObjType, String.Empty) <br/>

在渲染之前,我处理了SelectLists,这里没有问题。

现在有趣的地方来了:

在我的控制器中,我曾经有接收大量数据的方法(参见这里:如何处理许多可能的值来进行查询?)

但是现在我做了别的东西。我不假思索地尝试在控制器方法中添加旧的搜索模型,如下所示:

public ActionResult BrowseObjectList(SearchObjInfo searchObj, string _objName, (...))

我刚刚发现,它的工作,即使接收对象是不一样的,在我的部分视图模型中使用的一个。这怎么可能?我的意思是,适当的字段将填满,我可以"安全地"处理我的searchObj项目,虽然我不觉得这安全毕竟…

在局部视图中用作模型的对象会在控制器中创建另一个模型

这就是MVC框架为你做的。

浏览器只是将表单集合作为名称值集合发送到服务器。当请求到达服务器时,MVC框架会将值与Action方法中的parameter进行匹配。

  • 表单集合值映射到模型对象属性。这是通过与Form集合中的值的Property Name和Name进行匹配来完成的。只需通过视图源检查客户端代码,您可以看到输入标签将具有一个属性'name',该属性与模型的属性名称匹配。
  • QueryString值也将根据名称映射到Action方法中的参数。
  • 即使你在action方法中添加了一个隐藏字段并指定了一个同名的参数…在post back
  • 中,你会得到隐藏字段的值

在你的情况下,虽然模型是不同的,它的属性名称是相同的m_ObjName, m_ObjType, m_ObjNumber, m_ObjSymbol, m_ObjPower。MVC为你做一个匹配。

尝试使用不同的属性名并查看结果;-)