2013-02-18 33 views
0

如果我有一個模型,它看起來是這樣的:MVC模型的設計和使用

public class LoginModel 
{ 
    pulbic List<string> UserNames {get; set; } 
    public string SelectedUserName {get; set; } 
    public string Password {get; set; } 
} 

而且我也有一對夫婦的動作方法的控制器,看起來是這樣的:

public ActionResult Login() 
{ 
    LoginModel model = null; 

    model = new LoginModel(); 

    // Code to populate the UserNames property of the LoginModel instance (model)... 

    return View(model); 
} 

[HttpPost()] 

public ActionResult Login(LoginModel model) 
{ 
    if (ModelState.IsValid == true) 
    { 
    return RedirectToAction("SomeOtherAction") 
    } 
    else 
    { 
    return View(model); 
    } 
} 

我將需要重新填充模型對象的UserNames屬性,然後將其傳遞給View方法。這是我當然可以做的事,但它確實感覺有點。這讓我想到了這個問題。有沒有更好的方法來處理這個問題?

+2

你現在在MVC--想*無國界* – Nick 2013-02-18 22:32:12

+0

感謝所有的答案。每個回答似乎基本上表明相同的事情。有趣的是,如果我使用傳統的ASP.NET(閱讀,我從來沒有真正喜歡會話和視圖狀態),我不會考慮*重建*模型,所以我不知道爲什麼我會被抓到在這種情況下。我想我只是想確保我正在做正確的事情(或者至少以一種可以接受的方式),因爲我剛剛開始。 – 2013-02-19 14:11:36

回答

1

這是我當然可以做的事情,但它確實感覺有點骯髒。

它不髒。這就是MVC的工作原理 - >它是無狀態的。作爲替代,您可以將用戶名列表作爲隱藏字段添加到表單中,以便將其郵寄回控制器。但這不是您可以依賴的信息,因爲用戶可以修改這些值。所以如果你需要相信這些值,你最好爲你的後端查詢它們。

0

正如我已經瞭解MVC是你應該有一個方法在模型更新UserNames屬性。控制器應該做的所有事情(沒有其他更多)是將必要的參數傳遞給這個函數。那樣,你的控制器只是將它只能知道的信息傳遞給邏輯應該去的模型。

我不知道任何asp.net,所以我可以悲傷地不給你提供一個代碼示例。

0

基本上這取決於您的視圖實際上在做什麼。當然,如果您將UserNames集合呈現爲隱藏表單字段的列表,則模型綁定可以在http post上爲您執行此操作。這就是說,這是http編程的工作原理。國家不打算繼續之間獲取和帖子。

真的,你的選擇是重新建立你的列表或渲染出一些隱藏的領域(我不會建議),並讓模型綁定做它的事情。

0

通常我有一個處理數據庫訪問和填充視圖模型的特定模型(和密切相關的實體)的類(儘管您甚至可以添加另一個層,以便DB訪問和映射到視圖模型是分開的,也許可以利用一個映射框架)。無論哪種方式,它都會有一個像GetLogins這樣的方法,你可以在任何需要這樣的列表的地方打電話,甚至可能需要其他控制器,如朋友頁面,需要列出某人可以請求朋友的登錄名,一個人爲的例子,但你明白了。

由於您的Get和POST方法都需要重新顯示頁面(如果發生錯誤,POST),它們都可以調用GetLogins,這樣就不會在兩處重複該DB訪問代碼。