Как я могу передать измененную модель обратно в представление? - PullRequest
2 голосов
/ 10 ноября 2010

Представьте себе простое действие с постом

public ActionResult Unsubscribe(string contentId)
{
    // get db content and translate it to the UnsubscribeViewModel
    UnsubscribeViewModel model = 
        myRepository.FindUnsubscribeContentById(contentId).ToUnsubscribeViewModel();

    // pass model into the view
    return View(model);
}

[HttpPost]
public ActionResult Unsubscribe(UnsubscribeViewModel model)
{
    // let's convert into DalModel
    UnsubscribeModel m = model.ToUnsubscribeModel();

    // let's save into the db
    myRepository.UpdateUnsubscribe(m);

    // because I'm using 2 models, let's get the new ID 
    // and append to he View model
    model.FieldId = m.unsubscribe_id;

    // let's return the new model to the View
    return View(model);
}

Моя текущая проблема , даже если я делаю точку останова на линии return View(model), У меня есть model.FieldId правильно назначен , но на HTML-странице у меня есть исходное значение (в данном случае 0, поскольку не было предыдущего идентификатора, это новая запись)

в представлении, которое я пробовал:

<%: Html.HiddenFor(x => x.FieldId) %>

и

<%: Html.Hidden("FieldId", Model.FieldId) %>

, и они по-прежнему имеют значение "0", например

<input type="hidden" value="0" name="FieldId" id="FieldId">

, если яобновите страницу, мое действие извлечет новые данные, и значение изменится на правильный идентификатор.Но если я использую RedirectToAction("Unsubscribe"), я потеряю данные и не смогу передать сообщение Успех / Ошибка через ViewData, мне придется использовать RedirectToAction("Unsubscribe", new { something = msg }), и я не хочу этого.

Почему View загружает исходное значение вместо недавно обновленного значения из модели?

Спасибо.

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

Проблема не в передаче измененной модели обратно в представление.Это происходит правильно.Ваша проблема в том, как работают HTML-помощники.Это их нормальное поведение по замыслу.При привязке значения поля ввода они сначала смотрят значения POSTed, а затем - в ViewData и модели представления.Это означает, что вы не можете изменять значения POSTed в вашем действии контроллера.Как обходной путь:

<input type="hidden" value="<%= Model.FieldId %>" name="FieldId" id="FieldId" />

Я ответил это много раз до и продолжаю отвечать, надеясь, что люди наконец начнут замечатьэто.

0 голосов
/ 10 ноября 2010

Вы можете попробовать передать его другому контроллеру.Попробуйте это и посмотрите, работает ли это.Я создал дополнительный контроллер.Вам нужно будет создать новый вид, чтобы сделать эту работу

[HttpPost] 
public ActionResult Unsubscribe(UnsubscribeViewModel model) 
{ 
    // let's convert into DalModel 
    UnsubscribeModel m = model.ToUnsubscribeModel(); 

    // let's save into the db 
    myRepository.UpdateUnsubscribe(m); 

    // because I'm using 2 models, let's get the new ID  
    // and append to he View model 
    model.FieldId = m.unsubscribe_id; 

    // let's return the new model to the View 
    return View("UnsubscribeResult", model); 
} 


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