ASP.NET MVC Сохранение значения идентификатора mdoel при редактировании - PullRequest
2 голосов
/ 17 марта 2010
public Edit(int? id){ /* Codes */ }

[HttpPost]
public Edit(Item model){ /* Codes */ }

Я получаю копию Item в первом методе Edit, который будет содержать значение для ItemID. Но когда он попадает в метод HttpPost, значение id теряется.

Если переключено на

public Edit(int? ItemID){ /* Codes */ }

[HttpPost]
public Edit(Item model){ /* Codes */ }

таким образом ItemID может быть сохранен в модели Item. Но это хороший способ справиться с этим? Будет ли ASP.NET MVC всегда знать, что ему нужно подключить ItemID к Item? и есть ли другие способы сохранить значение идентификатора? Спасибо.

Ответы [ 6 ]

1 голос
/ 17 марта 2010

Является ли свойство вашей Item модели названием ItemID? Если это так, то средство связывания модели по умолчанию не будет заполнять его, если вы передаете поле с именем ID. Если вы измените сигнатуры вашего метода так, чтобы имена параметров совпадали с именами ваших Item свойств, они должны работать как положено.

1 голос
/ 17 марта 2010

Вы пытались добавить идентификатор в качестве параметра в действие Post?

public Edit(int? id){ /* Codes */ }

[HttpPost]
public Edit(int id, Item model){ /* Codes */ }

Таким образом, когда форма отправляется обратно, идентификатор будет заполняться из URL.

1 голос
/ 17 марта 2010

Я не могу понять, как вы теряете идентификатор при обработке HttpPost. Может быть, вы должны проверить свой переплет и, возможно, написать для себя? По моему опыту связующие по умолчанию немного громоздки. Вы можете начать с здесь , хотя я не претендую на то, что это лучшее решение. Если вам нужно написать множество папок вручную, взгляните на некоторые инструменты, которые могут помочь вам сделать преобразование декларативным способом, например AutoMapper .

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

Немного поздний ответ, но при использовании бритвы обычно используется скрытое поле, чтобы привязать идентификатор к модели.

        @Html.HiddenFor(model => model.Id)

Полная форма сообщения может выглядеть так:

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Address</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        @Html.HiddenFor(model => model.Id)

        <div class="form-group">
            @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.StreetLine1, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.StreetLine1, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.StreetLine1, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
        </div>
    </div>
}
0 голосов
/ 17 марта 2010

Способ решения проблемы идентификаторов MVC 2 - Необязательные параметры URL .

Если вы все еще используете MVC 1, используйте атрибут привязки для аргумента метода:

[HttpPost]
public ActionResult Edit([Bind(Exclude = "ItemID")] Item model)
{
    // ...
}
0 голосов
/ 17 марта 2010

Фил Хаак имеет сообщение, которое может иметь отношение к тому, что вы делаете, а может и не иметь.

Кроме того, если вы не отправляете идентификатор клиенту как часть формы (скрытое поле или еще что-то) и он не является частью URL-адреса POST, тогда будет иметь смысл только то, что у вас не будет поле идентификатора заполнено правильно на POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...