MVC Jquery Ajax调用返回一个视图,声称它传递了错误的模型

MVC Jquery Ajax call returning a view that claims it was passed the wrong model

我正在使用我的对话框。我在其中一个面板框中有一个创建表单。当通过ajax $.post()提交create表单时,该操作将返回一个带有成功消息的部分视图,以替换facebox中的视图。我遇到的问题是Firebug在Ajax调用完成时报告了一个500服务器错误,并说:

The model item passed into the dictionary is of type 'Models.ViewModels.SystemMessage', but this dictionary requires a model item of type 'Models.CouponCampaign'.

以下是成功消息的部分视图:

1
2
3
4
@model Redeemupon.Models.ViewModels.SystemMessage
 
        <img src="/Content/Images/Positive_48x48.png" alt=":-)"/>    
        @Html.Raw(Model.Message)

下面是传递这个局部视图的片段。

1
2
3
4
5
6
var viewModel = new SystemMessage()
{
    Message = message
};

return PartialView(viewModel);

最后,Ajax调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    $("#couponCampaignForm").submit(function () {

        var queryString = $(this).serialize();

        var action ="/CouponCampaign/Add?" + queryString;

        $.post(action, function (data) {

            //Load the resulting partial view into a facebox
            $.facebox(data);

            //Refresh the table
            var action ="/CouponCampaign/CouponCampaignTable";
            $.get(action, function (data) {
                $("#ajaxTable").html(data);
            });
        });

        return false;
    });

加载到facebox中的原始视图使用Models.CouponCampaign,第二个视图是否可能试图继承该模型?它应该被新的视图替换,用它自己的视图模型。

以下是我的globals.asax中的路由规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
           "Default", // Route name
           "{controller}/{action}/{id}", // URL with parameters
            new { controller ="Home", action ="Index", id = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
          "RegisterStaff", // Route name
          "Account/RegisterStaff/{tid}/{email}" // URL with parameters
       );

        routes.MapRoute(
          "ForgotPassword", // Route name
          "Account/ForgotPassword/{email}" // URL with parameters
       );



    }


编辑

因此,由于我从另一个操作调用SuccessMessage(字符串消息),并将部分视图返回到该操作,因此我需要显式声明我要返回的部分视图,因为一旦partialView结果冒泡到原始操作,它调用了错误的部分视图。

所以我需要:

1
return PartialView("SuccessMessage", viewModel);

这就成功了。


我猜你在你的CouponCampaignTable动作中给视图传递了一个错误的模型:

1
2
3
4
5
public ActionResult CouponCampaignTable()
{
    CouponCampaign model = ...
    return PartialView(model);
}

当然,CouponCampaignTable.cshtml部分应强类型化为CouponCampaign部分:

1
2
@model CouponCampaign
...

或者,问题可能在于您对Add控制器操作的初始$.post请求:

1
2
3
4
5
public ActionResult Add()
{
    SystemMessage model = ...
    return PartialView(model);
}