【问题标题】:Passing complex object from Angularjs controller to MVC controller is not working将复杂对象从 Angularjs 控制器传递到 MVC 控制器不起作用
【发布时间】:2015-10-15 18:38:10
【问题描述】:

在来自 Angular 控制器的 Ajax 调用中,我将一个复杂对象作为数据传递。在 MVC 控制器对象上具有所有空值。 我有如下给出的 MVC 视图,这将是注册客户视图的样板。

<div data-ng-app="customer" id="customer" data-ng-controller="rootViewModel">
<h2>{{ pageHeading }}</h2>
<hr />
<form id="formElement">
    <div ng-view></div>
</form>

使用 AngularJS,我将加载注册客户视图,下面给出注册客户视图的标记。我使用ng-click 指令注册了绑定到按钮的客户功能。

<fieldset class="form-horizontal">
<div class="form-group">
    <label class="control-label col-sm-3">Company Name</label>
    <div class="col-sm-4">
        <input class="form-control inputfieldValidation" ng-model="customer.Name" type="text" placeholder="Full company name" required autofocus />
    </div>
</div>
<div class="form-group">
    <label class="control-label col-sm-3">PAN</label>
    <div class="col-sm-4">
        <input class="form-control" ng-model="customer.Pan" type="text">
    </div>
</div>
<div class="form-group">
    <label class="control-label col-sm-3">TIN</label>
    <div class="col-sm-4">
        <input class="form-control inputfieldValidation" ng-model="customer.Tin" type="text" required />
    </div>
</div>
<button class="btn btn-primary proceedNext" id="registerCompany" ng-click="registerCompany(customer)">Register Customer</button>
</fieldset>

我有角度控制器,它有一个名为registerCustomer() 的函数,将在点击注册客户时调用。我在该函数中有一个 ajax 调用,如下所示。

customerModule.controller("CustomerRegistration", function ($scope) {
    var initialize = function () {
    }
    $scope.registerCompany = function (customer) {
        $.ajax({
            url: 'Home/RegisterCompany',//make sure url exist
            data: JSON.stringify({company: customer}),//pass data to action
            type:'POST',
            success: function (data) {
                alert(JSON.stringify(data));
                //window.location.href = '@Url.Action("Order")'; //redirect
            }
        });
    }
    initialize();
});

在 MVC 上,我有一个名为 Company 的模型,如下所示。

public class Company
{
    public string Name;
    public string Pan;
    public string Tin;
}

我的 MVC 控制器看起来像

[HttpPost]
public JsonResult RegisterCompany(Company company)
{
    //Do something
    return null;
}

在 MVC 控制器上总是有空对象,如果缺少任何东西,请帮助我。提前致谢

【问题讨论】:

  • 不建议将 Angular 与 jquery ajax 混合使用。如果我没记错的话,MVC 支持的默认内容类型不是 JSON,它是 x-www-form-urlencoded 所以这个代码失败的另一个原因
  • 此链接可能对您有所帮助stackoverflow.com/questions/20384242/…

标签: javascript html angularjs asp.net-mvc asp.net-mvc-4


【解决方案1】:

编辑:看起来您需要 mvc 中的视图模型或修改您的帖子:

public class CompanyViewModel {
      public Company company { get; set; }
}

或者用data: JSON.stringify(customer)代替data: JSON.stringify({ company: customer })


这是我们正在开发的网站的一个工作示例。它使用 Riot.js 而不是 angular,但概念相似。

另见http://www.abeautifulsite.net/postjson-for-jquery/

    $.getJSON(self.baseUrl + "/SaveApplicant", $('form.#applicant').serialize(), function (response) {
        if (response.errorMessage) {
            RiotControl.trigger('error_message', response.errorMessage);
            return;
        } else {
            self.packageQuote.applicant = response;
        }
        RiotControl.trigger("continue","applicant");
    });

或者使用帖子,根据上面的链接

    $.post(self.baseUrl + "/SaveApplicant", $('form.#applicant').serialize(), function (response) {
        if (response.errorMessage) {
            RiotControl.trigger('error_message', response.errorMessage);
            return;
        } else {
            self.packageQuote.census = response;
        }
        RiotControl.trigger("continue","applicant");
    },'json');

在 MVC 方面还涉及更多内容,即发回带有小写属性名称前缀的 json 响应:

    public ActionResult SaveApplicant(Applicant model)
    {
        if (ModelState.IsValid)
        {
            var applicant = DbContext.Applicants.FirstOrDefault(row => row.Id == model.Id);
            if (applicant == null) {
                DbContext.Applicants.Add(model);
            } else {
                applicant.Clone(model); // implement as needed or use entity state modified.
            }

            DbContext.SaveChanges();

            return FormattedJsonResult(applicant);
        }
        return ModelErrors();
    }

    public ActionResult FormattedJsonResult(object model)
    {
        var camelCaseFormatter = new JsonSerializerSettings();
        camelCaseFormatter.ContractResolver = new CamelCasePropertyNamesContractResolver();
        var result = JsonConvert.SerializeObject(model, camelCaseFormatter);
        return Content(result, "application/json");
    }

    public ActionResult ModelErrors()
    {
        return FormattedJsonResult(
            new
            {
                errorMessage =
                    String.Join("\n",
                        ModelState.Values.SelectMany(value => value.Errors).Select(error => error.ErrorMessage))
            });
        return View();
    }

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 2020-04-23
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2015-09-13
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多