Вызов MVC Jquery Ajax, возвращающий представление о том, что он был передан не той модели - PullRequest
2 голосов
/ 18 июля 2011

Я использую Facebox для своих диалоговых окон.И у меня есть форма создания внутри одного из этих Facebox-ов.Когда форма создания отправляется через ajax $.post(), действие возвращает частичное представление с сообщением об успехе, чтобы заменить представление в лицевой панели.Проблема, с которой я сталкиваюсь, заключается в том, что firebug сообщает об ошибке сервера 500, когда завершается вызов ajax:

Элемент модели, переданный в словарь, имеет тип ' Models.ViewModels.SystemMessage ', но для этого словаря требуется элемент модели типа' Models.CouponCampaign '.

Вот частичное представление для сообщения об успехе:

@model Redeemupon.Models.ViewModels.SystemMessage
<div class="successMessage" title="Success">  
        <img src="/Content/Images/Positive_48x48.png" alt=":-)"/>    
        @Html.Raw(Model.Message)      
</div>

И вот фрагмент, который пропускает это частичное представление.

var viewModel = new SystemMessage()
{
    Message = message
};

return PartialView(viewModel);

И, наконец,вызов ajax

    $("#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:

    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
       );



    }

Ответы [ 2 ]

0 голосов
/ 19 июля 2011

edit

SO, так как я вызывал SuccessMessage (строковое сообщение) из другого действия и возвращал частичное представление этому действию, мне нужно было явно объявить, какое частичное представление я хочучтобы вернуться, так как после того, как PartialViewResult всплыл до исходного действия, он вызвал неправильное частичное представление.

, поэтому мне нужно:

return PartialView("SuccessMessage", viewModel);

, и это помогло.

0 голосов
/ 18 июля 2011

Я полагаю, вы передаете неверную модель представлению в вашем CouponCampaignTable действии:

public ActionResult CouponCampaignTable()
{
    CouponCampaign model = ...
    return PartialView(model);
}

и, конечно, частичное CouponCampaignTable.cshtml должно быть строго набрано на CouponCampaign:

@model CouponCampaign
...

Или, возможно, проблема в исходном запросе $.post к действию контроллера Add:

public ActionResult Add()
{
    SystemMessage model = ...
    return PartialView(model);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...