2010-02-03 76 views
2

我在我的網站的各個部分都有我需要的表單。在asp.net-mvc中創建可重用部分的最佳方法

用戶輸入他們的地址,並提交保存地址的表單。 我想包裝這個,所以我可以重新使用它,因爲我需要在幾個地方完全相同的功能。

我想這樣做:

  1. 創建形式的局部視圖,但有傳過來的參數活動位置的URL。

  2. 創建一個單獨的類/方法將處理在服務器端驗證(UI具有使用jQuery已經它自己的驗證)

  3. 保存/編輯在DB層已經處理。

任何人都有更好的方法來做到這一點?

回答

1

ASP.NET MVC使用約定而不是配置,因此您可以使用它來根據最初請求的位置將您的地址表單提交給不同的操作。所以,如果你的避風港操作:

public ActionResult Foo() 
{ 
    return View(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public void Foo(string address) 
{ 
//code to update address 
} 

你Foo.aspx視圖將包含您的地址局部視圖,以及您所使用的輔助方法在局部視圖中創建表單:

<% using(Html.BeginForm()){ %> 
. 
. 
. 
<%}%> 

然後,當表單發佈時,您可以期待它調用您的Foo操作,該操作接受HTTP Post。

現在,如果創建一個名爲Bar.aspx新視圖其中還包含了兩個新動作地址局部視圖來服務你的頁面,然後接受這個職位數據:

public ActionResult Bar() 
{ 
    return View(); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public void Bar(string address) 
{ 
//code to update address 
} 

你不需要將任何數據傳遞給你的局部視圖,告訴它在哪裏發佈,因爲框架使用命名約定來解決它,也就是說,當從/ MyController/Foo提供服務時,Html.BeginForm會將/ MyController/Foo渲染爲張貼到。與/ MyController/Bar相同

希望那樣清楚!

0

我經常只是在這些地方創建表單,使用一個單獨的ViewModel和Wire來觸發相關的命令。 但是我並不過分害怕在一個項目的高水平重複 - 這是個人喜好的事情。

我會建議你的情況,使用一個局部視圖,假設視圖模型上有一個名爲Address的對象,在其綁定的名稱前面使用前綴。

視圖模型上的對象可以是所有視圖模型上使用的共享對象,這些視圖模型需要一個地址,比如說類型爲「AddressViewModelComponent」的稱爲「地址」的便利。

public class SomeViewModel 
    { 
     public string SomeFormValue 
     { 
      get; 
      set; 
     } 

     public string SomeOtherFormValue 
     { 
      get; 
      set; 
     } 

     public AddressViewModelComponent Address 
     { 
      get; 
      set; 
     } 

    } 

    public class AddressViewModelComponent 
    { 
     public string AddressLineOne 
     { 
      get; 
      set; 
     } 

     public string AddressLineTwo 
     { 
      get; 
      set; 
     } 

     // Etc 
    } 

這樣你就可以把需要它,你的部分觀點可能包含類似的任何視圖模型的地址如下:然後

<li><%= Html.TextBox("Address.AddressLineOne") %></li> 
<li><%= Html.TextBox("Address.AddressLineTwo") %></li>  

您的實際視圖形式會是這個樣子:

<% using(Html.BeginForm()) %> 
<ul> 
<li><%= Html.TextBox("SomeFormValue") %></li> 
<li><%= Html.TextBox("SomeOtherFormValue") %></li> 

<% Html.RenderPartial("AddressForm"); %> 
</ul> 
<%} %> 

默認的model binder知道如何尋找呼籲視圖模型「地址」的對象,並填充屬性上與相關屬性,視圖模型。

這可能是矯枉過正的,我從來沒有找到一個需要在項目上「共享」表單的實例,但上面可能是我開始考慮是否要這樣做的地方。

0

如果表單是獨立的,您可能會考慮使表單在一個控制器中可用。向保存重定向值的表單添加隱藏字段。一旦數據發佈並且控制器更新數據庫中的記錄,它就可以讀取重定向字段中的值,然後重定向到另一個控制器。

關閉我的頭頂,像這樣。這顯然需要充實一下:

AddressController:

public ActionResult Edit(int id) 
{ 
    return Edit(id, "Address", "Index"); // return to the Index page 
} 

public ActionResult Edit(int id, string controller, sting action) 
{ 
    Address address = MyDatabase.GetAddress(id); 
    ViewData["Action"] = action; 
    ViewData["Controller"] = controller; 
    return View(address); 
} 

public ActionResult Edit(Address address) 
{ 
    MyDatabase.Save(address); 

    // Read redirect from Form 
    string action = Request.Form["Action"]; 
    string controller = Request.Form["Controller"]; 
    return RedirectToAction(action, controller); 
} 

如果你想使用的形式從名爲控制器2不同的控制器,你可以使用這樣的事情:

public ActionResult EditAddressHere(int AddressID) 
{ 
    return RedirectToAction("Edit", "Address", new { id = AddressID, controller = "Controller2", action = "Saved" }); 
} 

public ActionResult Saved() 
{ 
    return View(); 
} 

我沒有包含視圖,但它應該足夠簡單,可以將控制器和操作數據存儲在窗體的隱藏字段中。