Перенаправление на проблему страницы ASP.NET MVC после запроса POST от Silverlight - PullRequest
0 голосов
/ 19 сентября 2010

В приложении ASP.NET MVC у меня есть CartController с этим AddToCart действием:

public RedirectToRouteResult AddToCart(Cart cart, decimal productId,
    string returnUrl)
    {
        Product product = productsRepository.Products
            .FirstOrDefault(p => p.prodID == productId);
        cart.AddItem(product);
        return RedirectToAction("Index", new { returnUrl });
    }

Когда пользователь отправляет POST-запрос ( «Добавить в корзину» кнопка) на это действие из простого представления ASP.NET MVC, все идет хорошо: продукт добавляется в корзину, а пользователь автоматически перенаправляется на страницу Cart/Index.

Если товар отправлен из приложения Silverlight (которое находится в представлении ASP.NET MVC), он также успешно добавляется в корзину, но в этом случае нет перенаправления .

В чем проблема? Может быть, это связано с тем, что все запросы от Silverlight являются асинхронными (если я не ошибаюсь), а запрос из общего представления ASP.NET MVC по своей природе является синхронным? Как это может повлиять на перенаправление?

В любом случае, как решить эту проблему?

Отредактировано (добавлено):

Мой код для отправки почтового запроса из приложения Silverlight:

//first build a "paramstring" in the format "productId=126504" and then post it using this     
WebClient wc = new WebClient();
        wc.Headers["Content-type"] = "application/x-www-form-urlencoded";
        wc.UploadStringAsync(new Uri("http://localhost:10930/Cart/AddToCart"), "POST", paramstring, "http://localhost:10930/Products");

1 Ответ

1 голос
/ 19 сентября 2010

WebClient, который вы используете для отправки запроса POST, автоматически будет следовать за перенаправлениями, выполненными на сервере, и вернет HTML, и все закончится обратным вызовом успеха.Если вы хотите перенаправить браузер пользователя на эту страницу, вы не должны использовать WebClient.Вам необходимо JavaScript, чтобы отправить <form>.Silverlight позволяет выполнять javascript , чтобы вы могли использовать его для динамического создания и отправки формы, или, если форма уже существует в DOM, задайте значения полей ввода и отправьте их.

Вот пример того, как вы могли бы сделать это.Добавьте следующую функцию javascript на ту же страницу, на которой размещено приложение Silverlight:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
    function addToCart(productId, returnUrl) {
        var form = $(document.createElement('form'))
        .attr('action', '/products/addtocart')
        .attr('method', 'post')
        .append(
            $(document.createElement('input'))
                .attr('type', 'hidden')
                .attr('name', 'productId')
                .val(productId)
        )
        .append(
            $(document.createElement('input'))
                .attr('type', 'hidden')
                .attr('name', 'returnUrl')
                .val(returnUrl)
        );
        $('body').append(form);
        form.submit();
    }
</script>

А затем в приложении Silverlight всякий раз, когда вы решите вызвать действие POST:

HtmlPage.Window.Invoke("addToCart", "123", "http://example.com/someReturnUrl");

Вы можете добавитьдругие параметры при необходимости.

...