1

我的应用程序发生了一些奇怪的事情。这不是可损坏的,但这是一种奇怪的行为,我正在与您联系以了解正在发生的事情。

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

所以这是我的旧模型的片段:

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 项目,尽管我发现这毕竟不安全......

4

1 回答 1

2

这就是 MVC 框架为你做的事情。

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

  • 表单集合值映射到模型对象属性。这是通过与 Form 集合中的值的属性名称和名称进行匹配来完成的。只需通过查看源代码检查客户端代码,您可以看到输入标签将具有与模型的属性名称匹配的属性“名称”。
  • QueryString 值也将根据名称映射到 Action 方法中的参数。
  • 即使您添加一个隐藏字段并在操作方法中指定一个具有相同名称的参数...tada 您将在回发时获得该变量中隐藏字段的值

在您的情况下,尽管模型不同,但其属性名称相同 m_ObjName、m_ObjType、m_ObjNumber、m_ObjSymbol、m_ObjPower。所以 MVC 为你做一个匹配。

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

于 2013-05-07T20:04:22.213 回答