ASP.NET MVC2: обновление модели для дальнейших модификаций в обработчике POST. - PullRequest
1 голос
/ 18 ноября 2010

Модель:

public class Model
{
    public ItemType Type { get; set; }
    public int Value { get; set; }
}

public enum ItemType { Type1, Type2 }

Контроллер:

public ActionResult Edit()
{
    return View(new Model());
}

[HttpPost]
public ActionResult Edit(Model model, bool typeChanged = false)
{
    if (typeChanged)
    {
        model.Value = 0; // I need to update model here and pass for further editing
        return View(model);
    }

    return RedirectToAction("Index");
}

И, конечно, вид:

<div class="editor-label"><%: Html.LabelFor(model => model.Type) %></div>
<div class="editor-field">
    <%: Html.DropDownListFor(
            model => model.Type,
            Enum.GetNames(typeof(MvcApplication1.Models.ItemType))
                .Select(x => new SelectListItem { Text = x, Value = x }),
            new { @onchange = "$(\'#typeChanged\').val(true); this.form.submit();" }            
        )
    %>
    <%: Html.Hidden("typeChanged") %>
</div>

<div class="editor-label"><%: Html.LabelFor(model => model.Value) %></div>
<div class="editor-field"><%: Html.TextBoxFor(model => model.Value) %></div>

<input type="submit" value="Create" onclick="$('#typeChanged').val(false); this.form.submit();" />

Код в контроллере (с комментарием) не работает, как я ожидаю. Как я могу достичь необходимого поведения?

1 Ответ

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

Как я писал здесь несколько раз, именно так работают HTML-помощники, и именно так: при генерации ввода они сначала смотрят на значение POSTed, а только после этого используют значение из модели. Это в основном означает, что изменения, внесенные в модель в действии контроллера, будут полностью проигнорированы.

Возможный обходной путь - удалить значение из состояния модели:

if (typeChanged)
{
    ModelState.Remove("Value");
    model.Value = 0; // I need to update model here and pass for futher editing
    return View(model);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...