Как MVC заполнить параметр Id? - PullRequest
1 голос
/ 25 сентября 2010

сегодня у меня есть интересное наблюдение, которое мне нужно объяснить.У меня есть мой Person класс, который описан выше:

public class Person
{
   public int Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
}

теперь в моем приложении MVC2 у меня есть PersonController со следующим методом редактирования:

public ActionResult Edit(int id)
{
    var permission = _service.GetPerson(id);
    return View(person);
}

[HttpPost]
public ActionResult Edit(Person person)
{
    if (ModelState.IsValid)
    {
        _service.UpdatePerson(permission);
        return RedirectToAction("Index");
    }

    return View(person);
}

Сейчас наВ моем представлении Edit.aspx у меня есть форма, которая содержит только FirstName и LastName, но что удивляет меня, когда сообщение выполняется в моем контроллере, у объекта Person правильно установлен Id (который не был частью формы).

Теперь я предполагаю, что оно взято из значения маршрута параметра id, который отправляется в мой адрес действия, но сохранен ли он?Я имею в виду .. Хорошо, что мне не нужно ставить скрытое поле для идентификатора, но есть ли опасность, вызванная смешиванием параметров get и post в mvc2?

И еще одна проблема.Что делать, если я поставлю скрытый для id.Затем он будет отправлен в обе стороны (получить и отправить), так что ... какой идентификатор будет использоваться?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2010

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

И чтобы ответить на ваш второй вопрос. Примите следующую форму:

<form action="/home/edit/5" method="post">
    <input type="text" name="Id" value="1" />
    <input type="submit" value="Go" />
</form>

В этом случае идентификатор будет взят из запроса POST, а не маршрута.

1 голос
/ 25 сентября 2010

Когда связыватель модели mvc по умолчанию связывает объекты, он ищет его значения во многих местах, и совпавший маршрут является одним из тех мест. если вы измените имя свойства ur с id на personID, оно не будет заполнено значением маршрута, и вам потребуется поместить скрытое поле в форму ur, чтобы получить его там. чтобы избежать такой путаницы, я всегда называю свойства, отличные от параметров маршрута.

...