2010-12-09 93 views
0

我想這是一個我們都知道的普遍模式。我們有一個顯示錶單的動作。該表格是指向另一個行動。根據驗證,我們重新定向或再次顯示無效表單。令人討厭的是當表單頁面需要一堆放置在ViewData中的變量時(有些可能是複雜的數據)。這要求在兩個操作中複製代碼。爲表單頁面設置ViewData變量的最佳方法?

你如何解決這個重複?一個例子可能是一個動作過濾器,以確保設置一些變量,但爲每個案例定義一個新的過濾器有點矯枉過正......或者一個InitAction方法?對此有最佳做法嗎?

public ActionResult EditSettings() 
{ 
    // Set some various variables for the view 
    ViewData["timezoneinfos"] = TimeZoneInfos; 
    ViewData["emailtemplates"] = Templates; 

    // Fill a SettingsForm object 

    return View(form); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditSettings(SettingsForm form) 
{ 
    if (ModelState.IsValid) 
    { 
     // TODO: save model 

     return RedirectToRoute(....); 
    } 

    // Set some various variables for the view (again) 
    ViewData["timezoneinfos"] = TimeZoneInfos; 
    ViewData["emailtemplates"] = Templates; 

    return View(form); 
} 
+0

不知道我得到的問題是正確的。在我看來,你想初始化你的viewdatadictionary與一些初始值?爲什麼不創建一個強類型的viewdata在構造函數中做到這一點?或者,創建一個GetViewData()方法,爲您進行初始化。 – 2010-12-09 23:25:48

回答

1

我已經在過去做了什麼地方讓你[HttpGet]版本的操作採取的視圖模型作爲參數

[HttpGet] 
public ActionResult EditSettings(SettingsForm form) 
{ 
    // Set some various variables for the view 
    ViewData["timezoneinfos"] = TimeZoneInfos; 
    ViewData["emailtemplates"] = Templates; 

    if(form.SomeKeyThatWouldBePopulatedOnPostBack == null) 
     // Fill a SettingsForm object 

    return View(form); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditSettings(SettingsForm form) 
{ 
    if (ModelState.IsValid) 
    { 
     // TODO: save model 

     return RedirectToRoute(....); 
    } 

    return EditSettings(form); 
} 
+0

回調「HttpGet方法」畢竟是一種乾淨而快速的方式來重新啓動表單。謝謝。 – 2010-12-14 15:23:04

0

儘量避免使用任意鍵設置ViewData。您應該有一個ViewModel對象,其中包含顯示視圖所需的所有數據。

public class EditSettingsViewModel { 
    public IEnumerable<TimeZoneInfo> TimeZoneInfos {get;set;} 
    //then your form properties etc... 
} 

將此模型設置爲您的視圖的視圖模型。

一般來說,每個視圖都應該有自己的ViewModel。

+0

是的,這通常是我所做的,但有時我無法避免它,並且/或者不希望圍繞另一個代碼無法訪問的代碼編寫包裝模型對象。無論如何,TimeZoneInfos不會被髮回POST操作... – 2010-12-09 21:36:36

+0

它並不總是最合適的。 `TimeZoneInfos`只會爲空 - 無關緊要,因爲您不會檢查它或將其包含在驗證中。 – 2010-12-10 09:00:30

1

我在某些情況下做什麼,以避免重複是覆蓋OnActionExecuted,並在那裏填寫ViewData

如果您只需要執行特定操作,您可以查看filterContext.ActionDescriptor.ActionName以獲取執行的操作名稱。

相關問題