2013-05-07 39 views
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,這裏沒有任何問題了。

現在,這裏的地方變得有趣:

在我的控制器,我曾經有接收大量的數據的方法(在這裏看到:How to deal with many possible values to make a query?

但現在我做別的事情。想也沒想,我試圖添加舊的搜索模式的控制器方法是這樣的:

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

我只是發現了,它的作品即使接收對象不一樣,在我的部分所使用的查看模型。這怎麼可能?我的意思是,適當的領域將填補,我可以「安全地」處理我的searchObj項目,但我不覺得這安全畢竟...

回答

2

這就是MVC框架爲你做的人。

瀏覽器只是將表單集合作爲名稱值集合發送到服務器。當請求到達服務器時,MVC框架將在Action方法中將值與參數相匹配。

  • 表單集合值映射到模型對象屬性。這是通過與表單集合中的屬性名稱和值的名稱匹配來完成的。只需通過查看源代碼檢查客戶端代碼,就可以看到輸入標籤將具有與模型的屬性名稱匹配的屬性「名稱」。
  • QueryString的值也將被映射到基於名稱的Action方法中的參數。
  • 即使你添加一個隱藏字段,並指定與操作方法相同名稱的參數......田田你會得到隱藏字段的值在變量上回發

在你的情況好像模型不同,它的屬性名稱是相同的m_ObjName,m_ObjType,m_ObjNumber,m_ObjSymbol,m_ObjPower。所以MVC爲你做一場比賽。

嘗試使用不同的屬性名稱並查看結果;-)

+0

非常感謝!我不知道這一點,而且「印象深刻」。 :) – hsim 2013-05-07 20:05:53

+0

ASP.NET Webforms也有類似的作用,只是框架會做一個映射到頁面中的控件,換句話說就是網頁類的屬性。希望你嘗試改變你的模型來審覈我的答案;-) – eka 2013-05-07 20:32:20

相關問題