2011-09-30 68 views
0

基本上我有一個表單,我正在動態添加對象。我正在用AJAX做這件事,所以可以初始化對象並用JSON返回它。每個新對象都有一個唯一的GUID分配給它,因此我們可以在模型集合中的每個對象被傳回到動作中時識別它們。MVC3 - 提交表單時在輸入按鈕上提交自定義輸入屬性

但是,我需要支持非JavaScript,所以我試圖編寫一個解決方案,將回發模型,並添加或刪除模型中給定的對象。在模型上可以有任意數量的這些新對象,所以我需要傳回幾件事情,以便在將模型返回到視圖之前找出要刪除的對象。這可以是:

a)用戶已刪除的對象的GUID。

b)已被點擊以標識要刪除哪個對象的按鈕。

問題是局部視圖是通用的,我想保持它的方式,所以我試圖通過每個局部視圖上的輸入按鈕傳回識別GUID,但不知道如何。我可以很容易地用JavaScript做到這一點,因爲我只是從頁面中刪除創建的AJAX對象,然後發佈它,當用戶單擊刪除鏈接,但無法弄清楚如何使用提交。基本上,我想要做這樣的事情:

@using (Project.Namespace.Infrastructure.Helpers.HtmlPrefixScopeExtensions.HtmlFieldPrefixScope _scope = Html.BeginCollectionItem()) 
{ 
<ul class="ulMedicationsControl"> 
    @Html.ActionLink("Remove This Object", "RemoveObject", null) 

    @Html.Input("RemoveObject", "Remove This Object", new { Prefix = _scope.Prefix, objectGUID = IdentifyingGUID }) 

@Html.HiddenFor(m => m.IdentifyingGUID); 

    <li class="liQuestion"> 
     @Html.MandatoryLabelFor(m => m.myField) 
     @Html.TextBoxFor(m => m.myField) 
    </li> 

</ul> 

<div id="@(_scope.Prefix).ajaxPlaceholder"></div> 
} 

在控制器:

[ActionName("FormName")] 
[AcceptParameter(Name = "RemoveObject", Value = "Remove This Object")] 
public ActionResult RemoveObject(MyParentModel model, string Prefix, string objectGUID) 
    { 

     Guid ID = new Guid(objectGUID); 

     foreach (ObjectModel object in model.objects){ 
      if (object.IdentifyingGUID == ID) 
      { 
       model.objects.Remove(object); 
       break; 
      } 
     } 

     return View(model); 
    } 

任何幫助我真的很感激,因爲我簡單的不能找出如何做到這一點!

EDIT

而且只是添加前綴屬性簡單地識別,其中在表格對象坐在。這將需要我找到哪個對象列表通過並移除對象,因爲模型中可能存在多個不同的列表。

回答

0

當輸入表單發佈時,HTML輸入只傳遞「name = value」,所以你只需要處理。有了<input type=submit>,您進一步受限於按鈕的value是其標題(即「myControl = Click Me!」已發佈),因此您無法在程序中插入任何有意義的值。

方法1:所以你留下了編碼,你需要到輸入的name的所有信息 - 一個工作正常的做法,但你必須得去挖掘到控制器的操作方法的FormCollection參數,而比依靠模型綁定。例如:

<input name="[email protected](_scope.Prefix)[email protected]" type="submit" value="Delete me" /> 

更好的,具有與一個ToString覆蓋封裝字符串格式,並具有輔助類解析/的TryParse /等靜態方法,它可以像這樣使用:

<input name="@(new DeleteToken{Prefix=_scope.Prefix, objectGUID=IdentifyingGUID})" type="submit" value="Delete me" /> 

在動作方法:

[HttpPost] 
public ActionResult Foo(FormCollection formData) 
{ 
    var deleteTokens = DeleteToken.ParseAll(formData.AllKeys); 
    foreach (var token in deleteTokens) 
    { 
     //...do the deletion 
    } 
} 

方法2:的另一種方法是將集團各項目到自己<form>(記住你不能嵌套表單) - 所以當提交發生時,只發布其周圍表單,你可以在其中隱藏隱藏的輸入和必要的數據。例如

<ul class="ulMedicationsControl"> 
    <form ... > 
     <!-- hidden field and submit button and whatever else here --> 
     ... 
    </form> 
</ul> 
+0

一個子表的工作方式提交我要刪除的對象,但問題是我再不能從模型收集的對象列表駐留在刪除此。另外,頁面的其餘部分則失去語境即提交子表單時,用戶在表單外的任何其他字段中輸入的任何內容都會丟失。 –

+0

此外,添加此問題的方法與此不同.http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx –

+0

只能看到接近方法1的東西會起作用 - 將數據編碼到按鈕的名稱中。 IIRC有一些瀏覽器(IE最有可能)使用'<按鈕值>' –