ViewModel не сохраняет значения при вызове контроллера Ajax.ActionLink

Когда я нажимаю ActionLink и устанавливаю значения ViewModel в контроллере, я вижу изменения при рендеринге View. Но те же значения приходят в контроллер как нулевые, когда я нажимаю ActionLink второй раз.

Как сохранить значение, чтобы оно попало в контроллер?

Вид:

 @Ajax.ActionLink("Click me", "AjaxTest", "Controller", new AjaxOptions() 
 { 
    UpdateTargetId = "updatePanel", 
    HttpMethod = "POST",
    OnSuccess = "A()" 
 })

<div id="updatePanel">
  @Html.Partial("~/Views/Shared/_UpdatableContent.cshtml", this.Model)
</div>

Контроллер:

[HttpPost]
public ActionResult AjaxTest(MyViewModel model)
{
    model.A = "A"
    return PartialView("_UpdatableContent", model);
}

Частичный вид _UpdatableContent:

@Html.HiddenFor(x => x.A)

@if (Model.A == "A")
{ 
    //Draw
}

person Sergejs    schedule 04.01.2013    source источник
comment
Похоже, вы пытаетесь передать объект модели через запрос GET. Вы не можете этого сделать.   -  person Forty-Two    schedule 04.01.2013


Ответы (2)


Попробуйте добавить this.Model в свой ActionLink следующим образом:

@Ajax.ActionLink("Click me", "AjaxTest", "Controller", this.Model, new AjaxOptions() { UpdateTargetId = "updatePanel" })

Этот метод передает модель обратно в запрос, что должно разрешить обновление.

Вероятно, моя самая большая претензия к ASP.NET MVC заключается в том, что различные «вспомогательные» функции перегружены до энной степени и не всегда последовательно с точки зрения порядка появления аргументов...

Надеюсь, это поможет :)

person Richard A.    schedule 04.01.2013
comment
Привет спасибо. Добавлено, что this.Model и Action больше не попадают. Может быть, мне нужно как-то изменить метод действия? - person Sergejs; 04.01.2013
comment
Сделано действие: общедоступный ViewResult AjaxTest (модель MyViewModel) - все еще не работает. Я вижу, что сгенерированная ссылка содержит параметры строки запроса для каждого свойства в модели представления, и я считаю, что метод Action должен содержать параметр для каждого из них? - person Sergejs; 04.01.2013
comment
Нет, есть шаг, который я где-то пропустил. Я поиграю и вернусь к вам. - person Richard A.; 04.01.2013
comment
Добавлен HttpMethod = POST в AjaxOptions и добавлен атрибут [AcceptVerbs(HttpVerbs.Post)] для моего метода Action. Сейчас вроде работает. - person Sergejs; 04.01.2013
comment
Не знаю почему, но больше не работает. Изменено исходное сообщение, не могли бы вы быстро взглянуть, если у вас есть время? - person Sergejs; 10.01.2013

У меня была такая же проблема. Установка HttpMethod = "Post" в AjaxOptions исправила это для меня, спасибо Sergejs.

Мой окончательный рабочий код выглядит следующим образом

@{
    AjaxOptions ajaxOptions = new AjaxOptions
    {
        HttpMethod = "Post",
        LoadingElementId = "product-adding-" [email protected],
        LoadingElementDuration = 100,
        OnSuccess = "AddedToCart"
    };
}
<div>
    @Ajax.ActionLink("Add to cart",
        "AddToCart",
        "Cart",
        new { id = Model.Product.Id, returnUrl = Request.Url.PathAndQuery },
        ajaxOptions,
        new { @class = "button" })
<img id="[email protected]" src="~/Images/ajax_loader.gif" />
</div>
person Martin Kearn    schedule 14.11.2013