2012-07-31 16 views
1

我有下面的代碼,當我點擊提交按鈕的名稱和值沒有被髮送到Ajax.BeginForm()不發送提交按鈕的名稱/值

@using(Ajax.BeginForm(new AjaxOptions{Url = "http://localhost/controller/action"})) 
{ 
    <button name="action" type="submit" value="Save"> 
     <span>Save</span> 
     <!-- More HTML tags here --> 
    </button> 
} 

我看看服務器在jquery.unobtrusive-ajax.js文件中查看它是否應發送被點擊的按鈕的名稱/值,並找到此代碼將這些值作爲屬性附加到稍後在發佈請求中傳遞的表單中。

$("form[data-ajax=true] :submit").live("click", function (evt) { 
    var name = evt.target.name, 
     form = $(evt.target).parents("form")[0]; 

    $(form).data(data_click, name ? [{ name: name, value: evt.target.value }] : []); 

    setTimeout(function() { 
     $(form).removeData(data_click); 
    }, 0); 
}); 

evt.target.nameevt.target.value值包含從註冊的點擊按鈕標籤內的HTML元素的名稱/值。

我設法通過在上面的代碼中將evt.target替換爲evt.currentTarget來實現它,但我有點擔心這可能會產生意想不到的副作用。

有沒有更好的方法將提交按鈕的名稱/值發送到服務器?

回答

1

我已經複製了你描述的問題,並且你提出的代碼修復似乎對我有用。

我可以理解您不願意修改標準jquery.unobtrusive-ajax.js庫,因爲您必須記住在發佈新版本時合併您的更改。更好的選擇是提交一個補丁,以便您可以檢查修補程序並希望將其納入標準庫。我不知道解決這個問題的最佳方法,但我相信很大一部分ASP.NET代碼現在是開源的,including MVC,而且微軟已經開始接受來自社區的代碼貢獻。我建議你看看http://aspnetwebstack.codeplex.com/瞭解更多信息。

作爲更改庫的替代方法,是否考慮過不需要在按鈕中包含子元素?如果您的按鈕僅包含文本(並且沒有標籤),則標準庫可正常工作併發布按鈕的名稱和值。如果你需要圖片,你可以用CSS background-image屬性來代替嵌套的img標籤。