Подтвердить что ты не робот

Такое же представление как для создания, так и для редактирования в MVC4

Можно ли иметь один вид бритвы для операций Create и Edit?

Если да, как мы это достигаем?

4b9b3361

Ответ 1

Конечно.

В сообщении, проверьте в контроллере, имеет ли первичный ключ значение 0, затем вставка, в противном случае обновление.

Просмотр должен быть одинаковым для Create and Edit.

Не забудьте включить:

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

На ваш взгляд

Например:

Модель:

public class DescriptionModel
{
    [Key]
    public int ID { get; set; }

    public string Description { get; set; }
}

CreateEdit.cshtml:

@model DescriptionModel

@using (Html.BeginForm("CreateEdit"))
{
    @Html.HiddenFor(model=> model.ID)
    @Html.EditorFor(model=> model.Description)
    <input type="submit" value='Submit' />
}

ОписаниеModel controller:

public ActionResult Create()
{
    return View("CreateEdit", new DescriptionModel());
}
public ActionResult Edit(int id)
{
    return View("CreateEdit", db.DescriptionModels.Find(id));
}

// Submit and add or update database
[HttpPost]
public ActionResult CreateEdit(DescriptionModel model)
{
    if (ModelState.IsValid)
    {
       // No id so we add it to database
       if (model.ID <= 0)
       {
           db.DescriptionModels.Add(model);
       }
       // Has Id, therefore it in database so we update
       else
       {
           db.Entry(model).State = EntityState.Modified;
       }
       db.SaveChanges();
       return RedirectToAction("Index");
    }

    return View(model);
}

Ответ 2

Я не рекомендую.

Это должен быть довольно длинный ответ, потому что в процессе есть много вещей, запросов и рабочих процессов нормального рабочего процесса MVC GET/POST. Я постараюсь ответить на ваш вопрос с минимальной необходимой информацией и почему я не рекомендую использовать один и тот же вид.

Во-первых, почему?

  • У вас нет контроля над представлениями, которые могут иметь чрезмерную проводку;
  • Отсутствует гибкость;
  • Нельзя использовать многократно используемые виды или части;
  • Трудно поддерживать представления (одно изменение в представлении должно быть проверено на обоих действиях).

Мой предлагаемый подход состоял бы в том, чтобы иметь разные действия/представления, но иметь общий код:

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

У вас будет дублированный код, но не весь код такой же, например, вы можете не захотеть отправить идентификатор в действие create, это напрямую не связано с вашим вопросом, но использование одного и того же представления подразумевает, что вы также отправляя одни и те же данные, и это не рекомендуется, особенно для перенаправления или массового присвоения. Подробнее о массовом задании здесь (Архитектурный подход - это то, что я здесь использую).

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

Модели привязки

public class UpdateBindingModel : CreateBindingModel {
    // since we are not using the same binding model, 
    // we can have a "real" validation rules on our update binding and view.
    [Required]
    public int? Id {get;set;}
}

public class CreateBindingModel {
    // no id here prevent overposting.
    [Required]
    public string Name {get;set;}
    [Required]
    public int? CountryId {get;set;}
}

Это гарантирует, что данные, которые вы отправляете в "Создать и редактировать", являются минимальными, и ничего больше.

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

Просмотр моделей

public class CreateViewModel : CreateBindingModel {
    public IEnumerable<SelectListItem> CountryList {get;set;}
}

public class UpdateViewModel : UpdateBindingModel {
    public IEnumerable<SelectListItem> CountryList {get;set;}
}

Как вы можете видеть, это дает вам много гибкости, но при этом имеет дублированный код (дополнительная информация, необходимая для модели представления для обоих представлений), которую можно смягчить несколькими способами (в зависимости от потребностей/контекста):

  • Имейте действие для извлечения общих данных и используя @Html.Action("GetCountryList");
  • Используйте ту же модель просмотра aka CreateUpdateViewModel и отбрасывая дополнительные свойства UpdateBindingModel в представлении, но все же отправляя соответствующую модель в POST.
  • Наличие ваших привязывающих моделей в качестве свойств и выбор одного или другого в конкретном представлении. (лучше использовать @Html.EditorFor вместо частичных, поэтому Model Binder будет работать без каких-либо дополнительных изменений кода)

Действия контроллера будут выглядеть так:

контроллер

[HttpGet]
public ActionResult Create(){
    ViewData.Model = new CreateViewModel();
    return View();
}

[HttpPost]
public RedirectToRouteResult Create(CreateBindingModel binding) {
    // check valid model state and create data
    return RedirectToAction("Index");
}

[HttpGet]
public ActionResult Update(int id) {
    var objectToEdit = service.GetObjectToEdit(id);
    ViewData.Model = new UpdateViewModel(objectToEdit);
    return View();
}

[HttpPost]
public RedirectToRouteResult Update(UpdateBindingModel binding) {
    // check valid model state and update data
    return RedirectToAction("Index");
}

И ваши взгляды:

Просмотры

Update.cshtml
<form action="Update">
    @Html.HiddenFor(Model.Id);
    @Html.Partial("EditFieldsPartial")
    <button>delete</button> // no delete button on create.
    <button>create new</button> // you can have a create new instead of update.
</form>

Create.cshtml
<form action="Create">
    @Html.Partial("EditFieldsPartial")
</form>

Примечание: код неполный и в большинстве случаев не использует помощников для краткости и ясности. НЕ копируйте пасту: D

Ответ 3

Я бы не рекомендовал этот подход, но вы могли бы загрузить основную форму в оба представления из частичного

Ответ 4

Просмотр может быть разделен для операций создания и редактирования с использованием той же модели. Однако, я бы настоятельно рекомендовал подумать об этом дважды. Во многих случаях вы захотите иметь другое представление для операций редактирования (например, скрыть некоторые входы, которые не должны быть правдоподобными), а также может быть немного отличаться от модели, поскольку она может иметь некоторые (или самые) значения. Эти различия приведут к некоторым условиям в представлении, проверяя, создаете ли вы или редактируете - что может сделать код хаотичным. Заключение:, прежде чем решить, иметь ли общий просмотр, попробуйте подумать о том, насколько экран редактирования будет отличаться от экрана создания, тогда вы можете решить.

Ответ 5

Вы конечно можете, но обычно это то, что я постараюсь избежать. Если действия создания и редактирования практически одинаковы, вы в конечном итоге дублируете много кода в контроллере. Обычно в этой ситуации у меня будет только несколько полей на моем контроллере "Добавить", а затем, как только элемент будет добавлен, я перенаправляю пользователя на страницу редактирования, где они могут заполнить остальную информацию.

Ответ 6

[HttpGet]
 public ActionResult myFun(int id = 0)
        {
            MyClass cls = new MyClass();
            if (id == 0)
            {
                //Insert mode ... no data will be shown to textboxes , when primary key ie. id=0
               //Display whole data
            }
            else
            {
                //Update mode... if id is not 0 ,data will be shown to textboxes
            }

            return View(cls);
        }