ASP.NET MVC Tip : 如何透過 Form Post傳遞array資料(非使用ajax時)

如何透過 Form Post傳遞array資料(非使用ajax時)

在ASP.NET MVC3 時,有改進了一個功能,可以在 ajax 呼叫時,輕鬆的利用JSON格式傳遞資料到Server端並自動繫結 (這實在是太好用了~~~~)
那如果在不需要使用ajax的情境呢,
比如我在商品頁選取了五個商品,要傳遞到購物車時,因為需要切換頁面所以就不適用ajax方式回傳,
來看一下透過Form Post範例


範例

controller


public ActionResult Save(List hiddenList)
{
     return View();
}

cshtml


@using (Html.BeginForm("Save", "Test", FormMethod.Post))
{
    @Html.Hidden("hiddenList")
    <input type="submit" />
}
<script>
    $(function () {
        ////將資料填入HiddenList
        var list = [];
        list.push(1);
        list.push(2);
        list.push(3);
        $('input[name=hiddenList]').val(JSON.stringify(list));
    });
</script>

 

測試

image

 

本來以為這功能可以輕輕鬆鬆完成的,
結果竟然MVC3 是無法自動繫結Array、List等型別的物件

 

解決方式

Step 1 增加自訂的FromJsonBinding


    /// 
    /// FromJsonAttribute
    /// 用在透過javascript 傳送json格式資料到controller時使用
    /// 
    public class FromJsonAttribute : CustomModelBinderAttribute
    {
        /// 
        /// JavaScriptSerializer
        /// 
        private readonly static JavaScriptSerializer serializer = new JavaScriptSerializer();

        /// 
        /// GetBinder
        /// 
        /// Binder
        public override IModelBinder GetBinder()
        {
            return new JsonModelBinder();
        }

        /// 
        /// JsonModelBinder
        /// 
        private class JsonModelBinder : IModelBinder
        {
            /// 
            /// BindModel
            /// 
            ///controllerContext
            ///bindingContext
            /// object
            public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {
                var stringified = controllerContext.HttpContext.Request[bindingContext.ModelName];
                if (string.IsNullOrEmpty(stringified))
                {
                    return null;
                }

                return serializer.Deserialize(stringified, bindingContext.ModelType);
            }
        }
    }

 

Step 2 接收參數加上剛剛建立的[FromJson]

 


public ActionResult Save([FromJson]List hiddenList)
{
    return View();
}

 

測試ok

SNAGHTML2372b0

 

ps. 此問題再 MVC 4 會內建,就不需要額外在處理囉~~~






 


 

  • 如果您覺得這篇文章有幫助,請您幫忙推薦一下或按上方的""給予支持,非常感激
  • 歡迎轉載,但請註明出處
  • 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝