如何将对象从MVC控制器发布到Web Api控制器?

时间:2014-10-01 23:46:53

标签: c# asp.net asp.net-mvc asp.net-mvc-5 asp.net-web-api2

场景是我的MVC视图将数据返回到Controller操作,而我的操作要求是构建一个对象并将其传递给外部Web API。我在动作中获取数据并构建对象。你能告诉我如何将对象传递给外部Web API吗?

还应该是JSON,object还是xml?

我在下面给出了我的控制器和Web API代码:

控制器操作:

 public ActionResult Submit(FormCollection form)
        {
            Options lead = new Options();            
            lead.Situation = form.GetValue("InsuranceFor").AttemptedValue;
            lead.State = form.GetValue("InsuranceState").AttemptedValue; 

            //Here I want to pass object to Web API


            return RedirectToAction("Parameters");
        }

Web API方法:

   public void Post(Lead_Options lead)
        {
            leadOptService.AddListOptions(lead);
        }

1 个答案:

答案 0 :(得分:0)

我刚刚完成了一个复杂的实现,只是为了满足类似的要求。我被分配将对象从C#MVC Controller发布到外部RESTful Web API。将来,Web API将保留,但C#MVC可能会被NodeJS / Angular应用程序替换。所以我做的是,将对象分配给序列化JSON格式的TempData,然后在页面重定向到的视图中,有条件地添加AngularJS,并将AngularJS帖子实现到外部WebAPI。在您的情况下,TempData看起来像这样:

    this.TempData["lead"] = new JavaScriptSerializer().Serialize(this.Json(lead, JsonRequestBehavior.AllowGet).Data); 

然后,在重定向的视图"参数"中,您可以添加此角度代码:

     @if (this.TempData["lead"] != null)
{
    <script type="text/javascript" src="@Url.Content("~/Contents/Scripts/angular.js")"></script>
    <script type="text/javascript">
        angular
       .module('app', [])
       .controller('controllerName', ['$http', '$scope', 'apiFactory', function ($http, $scope, apiFactory) {
           var leadRecord = '@Html.Raw(this.TempData["lead"])';
           var apiUrl = 'https://xxxxxxxxxxxxxx';

           apiFactory({
               method: 'POST',
               url: apiUrl + '/api/apiControllerName/Post',
               data: '=' + leadRecord,
               headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' }
           }).then(function (result) {
               console.log(result);
           });
        }])
        .factory('apiFactory', function ($http, $q) {
            return function (config) {
                var defered = $q.defer();
                $http(config)
                .success(function (result, status, headers, config) {
                    defered.resolve(result);
                })
                return defered.promise;
            }
        })
    </script>        
}

    <div ng-app="app" class="col-sm-12 sign-in-page">
         <div class="row" ng-controller="controllerName">

          .....  contents of redirected page ....

         </div>
    </div>

您的WebAPI - (假设它的C#Web API 2.2应该是这样的:

  [HttpPost]
    public string Post([FromBody]string jsonString)
    {
        try
        {
            IDictionary<string, string> data = JsonConvert.DeserializeObject<IDictionary<string, string>>(jsonString);

假设您的对象的值都是字符串......

这种实施可能并不理想,但它确实可以完成其工作

哦,或者,你可以简单地将角度POST添加到包含表单控件的原始视图中。但在我的情况下,这不是一个选项,因为View必须发布一个完整的帖子,必须在模型中处理完整帖子中的数据,然后控制器从模型中获取一些数据并将其与会话信息结合起来制作然后必须将对象发送到Web API控制器..