2012-05-01 18 views
0

我有一個下拉列表的視圖。其默認值存儲在會話變量中。但是,用戶改變這一點,在這種情況下輸入新數據。MVC3&Razor:如何構建表單和操作以允許回髮式功能?

我有下拉的變化處理程序:

@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(model => model.SelectedID, 
         new SelectList(Model.SelectValues, "Key", "Value", 
         Model.SelectedID), "", new { onchange = "this.form.submit()" }); 

... more fields ... 
<input type="submit" name="Save" /> 
} 

    [HttpPost] 
    public ActionResult Index(ViewModel vm) 
    { 
    ... decide if I update my data or save the changes ... 
    } 

我試過包裝選擇在一個單獨的表單標籤,但後來我SelectedID在我的視圖模型不更新的價值。

如何確定表單何時從下拉式更改發佈,以及何時從按鈕單擊發布?

+0

您提供了兩種提交數據的途徑? – Brian

+0

@Brian:基本上。一個是更改過濾器,另一個是更新過濾的數據。 – chris

+0

會jQuery和ajax是一個選項?基本上你可以使用更改的選擇列表來觸發一個jQuery的帖子,它可以從你的控制器調用一個方法,它返回你需要的東西,並重寫它,而不用做回發。 – Brian

回答

2

如果您不想在用戶更改下拉列表的選擇時重新加載整個頁面,則可以使用AJAX以靜默方式觸發對將執行必要更新的其他控制器操作的請求。例如:

@Html.DropDownListFor(
    model => model.SelectedID, 
    new SelectList(Model.SelectValues, "Key", "Value"), 
    "", 
    new { 
     id = "myddl", 
     data_url = Url.Action("update") 
    } 
) 

,然後在一個單獨的JavaScript文件:

$(function() { 
    $('#myddl').change(function() { 
     var form = $(this).closest('form'); 
     $.ajax({ 
      url: $(this).data('url'), 
      type: 'POST', 
      data: form.serialize(), 
      success: function() { 
       alert('update success'); 
      } 
     }); 
    }); 
}); 

,最後你可以有負責更新的控制器操作:

[HttpPost] 
public ActionResult Update(ViewModel vm) 
{ 
    ... this will be triggered everytime the user changes some value in the 
     droipdown list 
} 
+0

其實,我想重新加載頁面 - 表單中有大量的數據。 – chris

+0

整個頁面還是隻有一部分?如果它是某個部分,則可以從Update控制器操作返回一個部分,然後在AJAX成功回調中刷新相應的佔位符。 –

+0

我在想整個頁面,但可能不得不重新考慮一下。 – chris

1

最簡單的方法是隻需簡單地將一些行爲附加到這些元素的事件上,並用事件目標設置一個隱藏字段(到目前爲止,聽起來應該聽起來非常熟悉__EVENTTARGET)。

像這樣:

$('#someButton').click(function() 
{ 
    $('#someHiddenField').val('someButton'); 
}); 

$('#someDropDown').change(function() 
{ 
    $('#someHiddenField').val('someDropDown'); 
}); 

然後你的操作方法可以檢查此值,並採取適當的行動。

無論其

這聽起來好像你在MVC一個過時的概念思維。如果你真的需要一些新的信息,你應該考慮使用一些Ajax,如果你想更新頁面的一部分,然後讓你的一個action方法返回一個局部視圖。