2010-12-14 87 views
2

在我的數據庫中,我有40個只包含ID號和名稱的表。我的數據庫使用實體框架進行訪問。雖然我沒有任何困難,通過爲每個對象生成強類型視圖和回發方法來編輯它們,我想創建一個更通用的方法和視圖來查看和編輯這些對象。使用ASP.NET,MVC和實體框架創建通用編輯視圖

我正在使用下面的代碼來訪問每個對象。在這種情況下,它是「地址類型」的對象:

public ActionMethod EditAddressType(int ID) 
{ 
    var result = database.AddressType.Single(a => a.ID == ID); 
    View(result); 
} 

[HttpPost] 
public ActionMethod EditAddressType(int ID, FormCollection formValues) 
{ 
    var result = database.AddressType.Single(a => a.ID == ID); 
    UpdateModel(result); 
    database.SaveChanges(); 
    return View("SaveSuccess"); 
} 

視圖「EditAddressType」是強類型和工作正常,但有很多重複的代碼(每個對象的這一個實例)。我被告知我需要使用反射,但是我對如何實現這一點不知所措。我的理解是我需要檢索對象類型,以便可以將硬編碼引用替換爲對象,但我不確定如何從回發中獲取此信息。

我已經成功地將信息綁定到控制器中的ViewData並將其傳遞給知道查找此ViewData的ViewPage視圖,但我不知道如何將更改回發給控制器。

感謝您給我的任何幫助!

回答

0

如果您要編輯對象,則不需要在POST操作中從數據庫中重新獲取對象。當然,第一件事是到抽象我的數據訪問代碼從控制器:

public class AddressesController: Controller 
{ 
    private readonly IAddressesRepository _repository; 
    public AddressesController(IAddressesRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionMethod Edit(int id) 
    { 
     var result = _repository.GetAddress(id); 
     return View(result); 
    } 

    [HttpPut] 
    public ActionMethod Update(AddressViewModel address) 
    { 
     _repository.Save(address); 
     return View("SaveSuccess"); 
    } 
} 

你會發現,我已改名爲一些行動,並接受動詞,使該控制器多一點RESTFul

相關的觀點可能是這樣的:

<% using (Html.BeginForm<AddressesController>(c => c.Update(null))) { %> 
    <%: Html.HttpMethodOverride(HttpVerbs.Put) %> 
    <%: Html.HiddenFor(model => model.Id) %> 
    <%: Html.TextBoxFor(model => model.Name) %> 
    <input type="submit" value="Save" /> 
<% } %> 

至於這個IAddressesRepository接口的實現而言,這完全取決於你:實體框架,NHibernate的,XML文件,遠程Web服務調用, ...,這是一個與ASP.NET MVC無關的實現細節。

+0

這看起來很有前途。我一定會盡量讓我的程序更加RESTful。然而,我仍然不知道如何使它更通用,因此它可以更新AddressType之外的對象,比如UserType或EventType,它們也具有ID和Name組件。我試圖避免像AddressController或AddressType這樣的硬編碼,因爲當我想更新UserType時,我將使用完全相同的代碼,除了AddressType的所有實例都將被UserType替換。 – JimF 2010-12-14 22:05:05

+0

在上面顯示的Update方法中,我無法保存地址,因爲在傳遞給視圖時丟失了原始數據庫上下文。我嘗試使用_repository.Attach(地址)來重新應用其數據上下文,但會引發異常。這是我回到數據庫以獲取原始AddressType對象的原始原因,爲了使對象具有執行UpdateModel(...)所需的上下文 – JimF 2010-12-15 02:20:34