2009-09-02 162 views
3

我想知道是否有一個很好的示例如何使用模型綁定在MVC中編輯ASP.NET配置文件設置。ASP.NET模型綁定到ProfileCommon

目前我有:

  • 一個自定義的ProfileCommon類從ProfileBase的。
  • 強類型視圖(類型ProfileCommon)
  • 獲取和發佈與ProfileCommon和相關視圖一起使用的控制器上的操作。 (見下面的代碼)。

查看配置文件詳細信息的工作 - 窗體出現所有的字段都正確填充。

然而,保存表單卻給出異常:System.Configuration.SettingsPropertyNotFoundException:找不到設置屬性'FullName'。

思考這個問題很有意義,因爲模型綁定將實例化ProfileCommon類本身,而不是抓取httpcontext的一個。此外,保存可能是多餘的,因爲我認爲配置文件在修改時會自動保存 - 在這種情況下,即使驗證失敗也可能會自動保存。對?

無論如何,我目前的想法是,我可能需要爲模型綁定創建一個單獨的Profile類,但是當我已經有一個非常類似的類時,它似乎有點多餘。

這是否有一個很好的例子呢?

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Edit() 
    { 
     return View(HttpContext.Profile); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(ProfileCommon p) 
    { 
     if (ModelState.IsValid) 
     { 
      p.Save(); 
      return RedirectToAction("Index", "Home"); 
     } 
     else 
     { 
      return View(p); 
     } 
    } 

回答

3

當你說了的ProfileCommon實例從頭開始(而不是從HttpContext的)在後方案創建聽起來正確的 - 這是什麼DefaultModelBinder呢:它基於其默認創建類型的新實例構造函數。

我想你可以通過創建一個是這樣的自定義IModelBinder解決這個問題:

public class ProfileBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) 
    { 
     return controllerContext.HttpContext.Profile; 
    } 
} 

你可能需要做一些鑄造,使其適合您的個人資料類。

要使用此ProfileBinder,然後你可以將其添加到您的編輯控制器操作是這樣的:

public ActionResult Edit([ModelBinder(typeof(ProfileBinder))] ProfileCommon p) 
+0

感謝馬克,我認爲這可能會工作,但我想我試圖做這個錯誤的方式。問題是,如果對ProfileCommon類的任何驗證檢查都失敗,則已應用這些更改,對象標記爲骯髒且無論如何寫出。 我已經通過使用第二個類似的類(ProfileEdit)解決了這個問題,該類具有驗證邏輯和方法以應用於/從ProfileCommon類。它是更多的代碼,但很好地分離它,它只是工作。 –