2009-10-25 60 views
3

我是ASP.NET MVC的新手,所以這可能有一個明顯的答案。現在,我有我有很多輸入控件的視圖形式,所以我有一個看起來像這樣的動作:使用命名參數作爲控制器輸入與FormCollection

public ActionResult MyAction(string formItemOne, int? formItemTwo, etc...) 

它就像一個十參數,這是非常難看。我試圖將其更改爲:

public ActionResult MyAction(FormCollection formItems) 

然後動態解析項目。但是當我更改爲FormCollection時,表單項不再「自動」通過回發記住它們的值。爲什麼要改變FormCollection改變這種行爲?任何簡單的事情,我可以做到讓它再次自動工作?

感謝您的幫助,

〜賈斯汀

回答

4

另一種解決方案是使用模型而不是操縱原始值。就像這樣:

class MyModel 
{ 
    public string ItemOne { get; set; } 
    public int? ItemTwo { get; set; } 
} 

然後使用此代碼:

public ActionResult MyAction(MyModel model) 
{ 
    // Do things with model. 

    return this.View(model); 
} 

在你看來:

<%@ Page Inherits="System.Web.Mvc.ViewPage<MyModel>" %> 
<%= Html.TextBox("ItemOne", Model.ItemOne) %> 
<%= Html.TextBox("ItemTwo", Model.ItemTwo) %> 
0

也許是因爲他們沒有奇蹟般地插入的ModelState字典了。嘗試在那裏插入它們。

如果您使用UpdateModel()或TryUpdateModel(),我認爲這些值將會持續。

1

與單個更換您的參數大名單中,使用view model。如果在POST後您將此模型返回到您的視圖,那麼您的視圖將記住發佈的值。

視圖模型只是一個包含您的動作參數作爲公共屬性的類。例如,你可以做這樣的事情,免去:

public ActionResult MyAction(string formItemOne, int? formItemTwo, etc...) 

public ActionResult MyAction(FormItems formItems) 
{ 
    //your code... 
    return View(formItems); 
} 

其中FormItems是

public class FormItems 
{ 
    public property string formItemOne {get; set;} 
    public property int? formItemTwo {get; set;} 
} 

您可能會看到斯蒂芬·沃爾特的帖子ASP.NET MVC Tip #50 – Create View Models一個完整的例子。