2016-01-01 2 views
0

У меня есть страница со списком всех велосипедов (Bike.cshtml). При нажатии на отдельный велосипед я направляюсь на страницу редактирования (BikeEdit.cshtml). В нижней части редактора у меня есть две ссылки.Соответствующая маршрутизация действий Отмена и сохранение

@Html.ActionLink("Cancel", "Bikes", "Home") 
@Html.ActionLink("Update", "Bikes", "Home") 

Ожидается, что оба случая вернутся к списку велосипедов. Очевидно, что во втором я хочу сохранить изменения объекта модели в БД. Я соблазн разрешить его, отправив в модель так.

@Html.ActionLink("Cancel", "Bikes", "Home") 
@Html.ActionLink("Update", "Bikes", "Home", @Model, null) 

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

Другим подходом, который я могу придумать, является добавление нового действия, BikeSave и выполнение сохранения в нем. Однако возвращенный экземпляр представления не будет основан на Bikes.cshtml, но BikeSave.cshtml. Я могу себе представить, что я мог бы использовать RedirectToAction, но я чувствую себя неуверенно. Я не хочу создавать что-то, используя «клейкую ленту».

Так что я пошатываясь голову не будучи в состоянии решить ...

+0

Почему вы не используете метод Post для Edit (если у вас есть метод Get)? –

+1

Не могли бы вы объяснить немного больше, пожалуйста? Вы имеете в виду, что я должен обрабатывать как сохранение, так и отображение в Bikes.cshtml? –

ответ

1

Когда пользователь нажимает на кнопку обновления, вы должны сделать форму представить вашему HttpPost метод действия, где вы будете обновлять БД, а затем перенаправлять на страницу Home/Bikes.

Предполагая, что ваш GET действие, как это

public ActionResult BikeEdit(int id) 
{ 
    var bikeEditVm=new BikeEditVm { Id=id}; 
    var bikeEntity = db.Bikes.FirstOrDefault(s=>s.Id==id); 
    if(bikeEntity!=null) 
    { 
    bikeEditVm.ModelName=bikeEntity.ModelName; 
    bikeEditVm.Color=bikeEntity.Color; 
    return View(bikeEditVm); 
    } 
    return View("NotFound"); // return a bike not found view to user 
} 

Где BikeEditVm вид модели для вида редактирования, который выглядит следующим образом

public class BikeEditVm 
{ 
    public int Id {set;get;} 
    public string ModelName {set;get;} 
    public string Color {set;get;} 
} 

на ваш взгляд, который сильно типизированных к BikeEditVm, вы сохраните все свои редактируемые поля внутри метки form

@model BikeEditVm 
@using(Html.BeginForm()) 
{ 
    <label>ModelName</label> 
    @Html.TextBoxFor(s=>s.ModelName) 
    <label>Color</label> 
    @Html.TextBoxFor(s=>s.Color) 
    @Html.HiddenFor(s=>s.Id) 
    <input type="submit" value="Update" /> 
} 
@Html.ActionLink("Cancel","Bikes","Home") 

У вас будет метод HttpAction для обработки публикации формы, где вы будете читать существующий объект из базы данных, обновите соответствующие поля, которые вы хотите обновить, и сохраните их.

[HttpPost] 
public ActionResult BikeEdit(BikeEditVm model) 
{ 
    var bikeEntity = db.Bikes.FirstOrDefault(s=>s.Id==model.id); 
    if(bikeEntity!=null) 
    { 
    bikeEntity .ModelName = model.ModelName; 
    bikeEntity .Color = model.Color; 
    db.Entry(bikeEntity).State=EntityState.Modified; 
    db.SaveChanges(); 
    return RedirectToAction("Bikes","Home"); 
    } 
    return View("NotFound"); 
} 

EDIT:Отвечая на некоторые вопросы, заданные ОП в комментариях здесь для будущих читателей.

(1) Я протестировал, чтобы пропустить [HttpPost], и он работает по-прежнему. Должно ли это?

Всех обновления данных должна быть HttpPost method.otherwise, люди могут получить доступ к методу действия через URL (метод GET) и передать имя-значение полой формы и может попытаться обновить данные. (Вашего разрешения проверки могут предотвратить это, если существует, хотя есть)

(2) Как ваш Html.BeginForm() знает, куда направлять? Я использую Html.BeginForm (действие, контроллер).

Если вы не передадите какие-либо аргументы методу BeginForm, он установит значение действия формы в качестве текущего URL-адреса. Пример: если вы работаете с клиентом/создаете GET, ваша форма будет отправлена ​​клиенту/создать. Вы можете переопределить это поведение, используя другую перегрузку, где вы можете указать другое имя метода/имя контроллера.

(3) Если я хочу поле передается вверх/вниз, но не быть редактируемые/видимый, я должен использовать CSS, чтобы скрыть это? Было бы неплохо иметь управление для внеэкранного хранения.

Если вы не хотите, чтобы поле было редактируемым/видимым, не делайте его передаваемым событием. У вас есть только те свойства, которые вам действительно нужны в вашем представлении. Прочитайте следующий ответ о том, как предотвратить публикацию сообщений.

(4) Как правило, лучше всего иметь специализированную модель для вида вместо того, чтобы использовать один из EF?

Это. Если вы используете классы сущностей, созданные вашей ORM для передачи данных между вашим методом действий и представлением, вы делаете плотно соединенное решение. Что делать, если вы решите не использовать EF в качестве уровня доступа к данным завтра по любой причине? Вы хотите пойти и обновить все свои взгляды? Модели вашего вида относятся к виду. Поэтому сохраните только те свойства/поля, которые необходимы для представления. Это также поможет вам prevent overposting.

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

  • Нет связанных вопросов^_^