Идентификатор модели ASP.NET MVC 3 с использованием значения идентификатора маршрута - PullRequest
4 голосов
/ 15 марта 2011

Сценарий
Маршрут: / template / customize / 10 Где: 10 = ID шаблона ()

В контроллере модель создается на основе шаблона, так чтоМодель представления на самом деле является объектом Customization (), который на самом деле имеет Id 0, потому что он новый.

В представлении я отображаю @ Html.HiddenFor (m => m.Id) и полученное значение этого скрытоговходные данные 10 , хотя они должны быть 0 , поскольку m имеет тип Customization.Я сталкивался с этим раньше с MVC 2 и обходил его, не используя вспомогательные методы.

Вопросы

  1. Есть ли аннотация или что-то, что я могу добавить в метод Html Helper, чтобы фактически отобразить правильное значение?

  2. Является ли это ошибкой (MVC, похоже, отображает m.Id в качестве значения маршрута независимо от того, какая фактическая модель установлена ​​в контроллере)?

Дополнительный код для уточнения

Вид

@model Project.Core.Domain.Customization
@using( Html.BeginForm( "save", "customization" ) )
{
    @Html.HiddenFor( m => m.Id )
    @Html.HiddenFor( m => m.Template.Id )
    <button type="submit" id="save" name="save">Save</button>
}

Контроллер

       public ActionResult Customize( int id )
    {
        var template = Persistence.Data.RetrieveObject<Template>( id );
        var model = new Customization();

        ViewBag.Template = template;
        return ( View( model ) );
    }

Решение

Изменена подпись действия на:

public ActionResult Customize( int TemplateId ){ ... }

Изменена ссылка на действие как таковое:

@Html.ActionLink( "customize", "customize", new { TemplateId = template.Id } )

Я в конечном итогес URL-адресом, который выглядит как

/template/customize?TemplateId=10

Это уродливее, но я получаю, чтобы держать мой взгляд в чистоте с моделью. Так что это победа для меня.

Ответы [ 3 ]

6 голосов
/ 06 февраля 2014

В этом случае вы всегда можете не использовать HTML Helper и использовать вместо него обычный HTML:

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

2 голосов
/ 15 марта 2011

Я думаю, это потому, что когда вы используете что-то вроде @Html.HiddenFor( m => m.Id ), помощники html просматривают разные места, чтобы заполнить значение ввода, и значения в маршруте являются одним из таких мест.

Таким образом, вы можетелибо измените ваш маршрут так, чтобы он был похож на template/customize/{TemplateId}, а затем отразите это в вашем методе действия, например, public ActionResult Customize(int templateId).

ИЛИ вы можете изменить свою модель представления (или создать собственную модель представления), которая имеет *Свойство 1008 *, а не просто Id.

И нет, это не ошибка ... это скорее функция, которая может иметь непредвиденные последствия.Но как только вы осознаете это, это работает как удовольствие.

0 голосов
/ 17 апреля 2016

Чтобы значения маршрута не перекрывали соответствующие свойства модели, вызовите ModelState.Clear() в действии вашего контроллера.Будьте осторожны, чтобы вызывать этот метод после с использованием / чтением состояния модели.

public ActionResult Customize( int id )
{
    var template = Persistence.Data.RetrieveObject<Template>( id );
    var model = new Customization();

    ViewBag.Template = template;

    this.ViewData.ModelState.Clear(); // add that after you consume the ModelState
    return ( View( model ) );
}

С моей стороны, скрытый ввод получает значение модели вместо значения маршрута.

...