Как отправить сложные типы в контроллер MVC2 через Jquery (Ajax) - PullRequest
1 голос
/ 22 февраля 2011

Я отправляю сериализованный объект Jquery Json на мой контроллер, но не все данные передаются. Один из членов является сложным типом, который также сериализован Json. Это тот, который не доходит до контроллера.

Вот класс, который я передаю своему контроллеру через пост Ajax. Обратите внимание на сложный тип, RoutingRuleModel.

SourceCodeModel.cs:

[Serializable]
public class SourceCodeModel
{
    public string SourceCode { get; set; }
    public bool IsActive { get; set; }
    public string LastChangedBy { get; set; }
    public string LocationCode { get; set; }
    public string Vendor { get; set; }
    public RoutingRuleModel RuleModel { get; set; }
}

RoutingRuleModel.cs:

[Serializable]
public class RoutingRuleModel
{
    public string AdaStuInfoSysId { get; set; }
    public string AdaInitials{ get; set; }
    public string LocationCode { get; set; }
    public string Vendor { get; set; }
    public string RuleName { get; set; }
    public string RuleStatus { get; set; }
    public int RuleId { get; set; }
}

Вот как я строю модель в JavaScript:

getSourceCodeModel = function (sourceCode, isActive, lastChangedBy, locationCode,   ruleModel) {
    // Retrieves a SourceCodeModel object that can be JSON-serialized
    return ({
                    SourceCode: sourceCode,
        IsActive: isActive,
        LastChangedBy: lastChangedBy,
        LocationCode: locationCode,
        Vendor: ruleModel.Vendor,

        RuleModel: [{ AdaStuInfoSysId: ruleModel.AdaStuInfoSysId, AdaInitials: ruleModel.AdaInitials, LocationCode: ruleModel.locationCode, 
            Vendor: ruleModel.Vendor, RuleName: ruleModel.RuleName, RuleStatus: ruleModel.RuleStatus, RuleId: ruleModel.RuleId}]
    });
};

Вот мой вызов JQuery Ajax:

$.ajax({
            type: "POST",
            url: "/LeadRoutingConsole/VendorLeadRouting/PostSourceCode",
            data: sourceCodeModel,
            datatype: "json",
            success: Commit_success,
            error: Commit_error,
            complete: function (jqXHR) { }
        });

Вот метод действия моего контроллера:

[HttpPost]
    public JsonResult PostSourceCode(SourceCodeModel model)
    {
        // perform the save op
        var viewModel = new SourceCodesViewModel();
    viewModel.PostSourceCode(model);
        return Json(model);
    }

Проблема: SourceCodeModel содержит правильные значения, КРОМЕ для его сложного члена: RuleModel, который возвращается как RoutingRuleModel со значениями по умолчанию (null или 0).

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Вы пытаетесь отправить коллекцию как RuleModel, тогда как это не свойство коллекции. Поэтому попробуйте так (снимите квадратные скобки [] вокруг определения свойства RuleModel):

getSourceCodeModel = function (sourceCode, isActive, lastChangedBy, locationCode,   ruleModel) {
    return ({
        SourceCode: sourceCode,
        IsActive: isActive,
        LastChangedBy: lastChangedBy,
        LocationCode: locationCode,
        Vendor: ruleModel.Vendor,
        RuleModel: { 
            AdaStuInfoSysId: ruleModel.AdaStuInfoSysId, 
            AdaInitials: ruleModel.AdaInitials, 
            LocationCode: ruleModel.locationCode, 
            Vendor: ruleModel.Vendor, 
            RuleName: ruleModel.RuleName, 
            RuleStatus: ruleModel.RuleStatus, 
            RuleId: ruleModel.RuleId
        }
    });
};

Также никогда не задавайте жесткие URL-адреса, как вы делали в своем JavaScript. Всегда используйте помощников Url при работе с URL-адресами, иначе вы можете получить неприятные сюрпризы при развертывании приложения:

$.ajax({
    type: 'POST',
    url: '<%= Url.Action("PostSourceCode", "VendorLeadRouting") %>',
    data: sourceCodeModel,
    dataType: 'json',
    success: Commit_success,
    error: Commit_error,
    complete: function (jqXHR) { }
});

Также обратите внимание, что параметр называется dataType: 'json' вместо datatype: 'json', что важно для чувствительного к регистру языка, такого как javascript.

0 голосов
/ 04 августа 2011

Вы можете написать CustomFilterAttribute для действия контроллера и десериализовать объект json в вашем классе CustomFilterAttribute.Что-то вроде ...

public class JsonFilter : ActionFilterAttribute
{
    public string Param { get; set; }        
    public Type JsonType { get; set; }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
       DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(SourceCodeModel));
       filterContext.HttpContext.Request.InputStream.Position = 0;
       SourceCodeModel result = serializer.ReadObject(filterContext.HttpContext.Request.InputStream)
              as SourceCodeModel;
       filterContext.ActionParameters[Param] = result;
    }
}

и действия контроллера ...

[HttpPost]
[JsonFilter(Param = "sourceCodeModel", JsonType = typeof(SourceCodeMode))]
public JsonResult PostSourceCode(SourceCodeModel model)
{...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...