2012-06-22 5 views
8

У меня есть ViewModel Я связывающийся с целью:ASP.NET MVC лучший способ опубликовать идентификатор модели?

ProductViewModel model = Mapper.Map<Product, ProductViewModel>(product); 
return View(model); 

мнение (и ViewModel) используется, чтобы редактировать Product так ProductViewModel имеет свойство ID, который соответствует ID в базе данных.

И Выкладываю ID обратно на контроллер Я делаю это в моей форме на представлении:

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

Даже если это работает - Мне было интересно, есть ли лучший способ, чтобы отправить ID обратно в контроллер? Значения маршрута могут быть? или это довольно стандартный шаблон/подход?

ответ

11

Если у меня есть действие GET, который включает идентификатор в моем маршруте: /Products/Edit/1 то я обычно держать его в качестве значения по маршруту:

[HttpPost] 
public ActionResult Edit(int id, EditProductViewModel model) 

Это чисто предпочтение мой, хотя. Нет правильного или неправильного способа сделать это.

Приятная вещь в этом методе - вам больше не нужно передавать его с использованием скрытого значения, так как оно является частью URL-адреса. На самом деле, если вы передадите его со Скрытым значением, я верю, что он будет проигнорирован.

В качестве альтернативы, поскольку идентификатор является частью маршрута, вам даже не нужно иметь отдельный параметр:

[HttpPost] 
public ActionResult Edit(EditProductViewModel model) 

public class EditProductViewModel 
{ 
    public int Id { get; set; } 
} 

Опять же, это чисто предпочтение вещь.

+0

Я не думаю, что скрытые поля игнорируются, они, похоже, отображаются на объект модели точно так же, как видимое поле. – Greg

+0

@Greg Я имел в виду, если бы у вас было скрытое поле под названием 'id', и у вас было значение маршрута, называемое' id', значение маршрута выиграло бы. – Dismissile

+0

Ах, я получил тебя! – Greg

1

Я думаю, что ответ есть, это зависит.

Является ли ваш целым объектом редактируется и отправляется обратно? Если это так, я предложил отправить идентификатор в качестве части модели:

[HttpPost] 
public ActionResult Edit(EditProductViewModel model) 

Который, по моему мнению, является абсолютно правильной вещью. Однако будьте осторожны. Если редактируемый ресурс является защищенным ресурсом, убедитесь, что у вас есть правильные привилегии.

Если это частичное изменение, возможно, просто редактирование комментария с помощью вызова Ajax я, вероятно, был бы более искушенным сделать:

[HttpPost] 
public ActionResult Edit(int id, string comment) 

Как создать модель в этом случае я хотел бы видеть, как избыточен .. . проблема привилегия все еще применяется, хотя :)

Все, что было сказано, я не являюсь экспертом сам :)

... Кстати, я не думаю, что нет ничего плохого в скрытом поле, я использую все время. Однако это вызов ajax, который может не понадобиться, так как это будет частью вашего аякс-запроса для публикации.

Смежные вопросы