HiddenFor (x => x.Id) заполняется параметром UrlParameter вместо ViewModel - PullRequest
11 голосов
/ 06 января 2012
public ActionResult SomeAction(int Id){
    //Id is set to 2

    var model = //get some thing from db using Id(2);
    //Now model.Id is set to 9;

    return View(model);
}

----------View----------
@Html.HiddenFor(x => x.Id)

Когда я просматриваю источник, для этого скрытого поля задается значение 2, а не 9. Как получить его для сопоставления с моделью вместо сопоставления с информацией о маршрутизации URL?

PS Я бы предпочел не переименовывать параметры, потому что тогда я потеряю свои красивые URL, если я не изменю информацию о маршрутизации.Я сделал это, и это работает, но не то, что я хочу.

Ответы [ 3 ]

24 голосов
/ 06 января 2012

Когда вызывается Action, платформа создает ModelStateCollection на основе значений строки запроса, пост-данных, значений маршрутизации и т. Д. И это ModelStateCollection будет передано View. Все помощники ввода HTML пытаются получить значения из ModelStateCollection first , прежде чем пытаться получить значения из фактической модели.

Поскольку вашей входной моделью является int id, а выходной моделью является какая-то новая модель, помощники будут использовать значения из ModelStateCollection (из строки запроса), поскольку имена свойств Id совпадают.

Чтобы это работало, вы должны вручную очистить ModelStateCollection перед возвратом новой модели в представление:

public ActionResult SomeAction(int Id){
    //Id is set to 2

    ModelState.Clear();

    var model = //get some thing from db using Id(2);
    //Now model.Id is set to 9;

    return View(model);
}
4 голосов
/ 06 января 2012

Вы можете попробовать это ниже

<input id="Id" type="hidden" value="@Model.Id" />

Может быть не совсем то, что вы хотите, но, по сути, делает то же самое.

0 голосов
/ 29 января 2018

Вы можете использовать TextBoxFor и скрыть его с помощью CSS как

@Html.TextBoxFor(x => x.Id, new { @style="visibility:hidden; width:4px;"})

Это сработало для меня.

...