Создание общего вида редактирования с ASP.NET, MVC и Entity Framework - PullRequest
2 голосов
/ 14 декабря 2010

В моей базе данных у меня есть 40 таблиц, которые содержат только идентификационный номер и имя.Моя база данных доступна с помощью Entity Framework.Хотя у меня нет проблем с редактированием каждого из них путем создания строго типизированных методов представления и обратной передачи для каждого объекта, я хотел бы создать более общий метод и представление для просмотра и редактирования этих объектов.

В настоящее время я используюследующий код для доступа к каждому объекту.В данном случае это для объекта AddressType:

public ActionMethod EditAddressType(int ID)
{
    var result = database.AddressType.Single(a => a.ID == ID);
    View(result);
}

[HttpPost]
public ActionMethod EditAddressType(int ID, FormCollection formValues)
{
    var result = database.AddressType.Single(a => a.ID == ID);
    UpdateModel(result);
    database.SaveChanges();
    return View("SaveSuccess");
}

Представление EditAddressType строго типизировано и работает нормально, но есть много повторяющегося кода (один экземпляр этого для каждого объекта).Мне сказали, что мне нужно использовать рефлексию, но я не знаю, как это реализовать.Насколько я понимаю, мне нужно получить тип объекта, чтобы я мог заменить жестко запрограммированную ссылку на объект, но я не уверен, как получить эту информацию из обратной передачи.

Я успешно связалинформацию ViewData в контроллере и передачу ее представлению ViewPage, которое знает, как искать эти ViewData, но я не знаю, как отправить изменения обратно в контроллер.

Спасибо за любую помощь, которую вы можете мне дать!

1 Ответ

0 голосов
/ 14 декабря 2010

Если вы собираетесь редактировать объект, вам не нужно повторно извлекать его из базы данных в вашем действии POST.Первым делом, конечно, будет абстрагировать мой код доступа к данным от контроллера:

public class AddressesController: Controller
{
    private readonly IAddressesRepository _repository;
    public AddressesController(IAddressesRepository repository)
    {
        _repository = repository;
    }

    public ActionMethod Edit(int id)
    {
        var result = _repository.GetAddress(id);
        return View(result);
    }

    [HttpPut]
    public ActionMethod Update(AddressViewModel address)
    {
        _repository.Save(address);
        return View("SaveSuccess");
    }
}

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

Связанное представление может выглядеть следующим образом:

<% using (Html.BeginForm<AddressesController>(c => c.Update(null))) { %>
    <%: Html.HttpMethodOverride(HttpVerbs.Put) %>
    <%: Html.HiddenFor(model => model.Id) %>
    <%: Html.TextBoxFor(model => model.Name) %>
    <input type="submit" value="Save" />
<% } %>

Что касается реализации этого интерфейса IAddressesRepository, это полностью зависит от вас: Entity Framework, NHibernate, XML-файл, вызов удаленной веб-службы, ..., это деталь реализации, не имеющая ничего общего с ASP.NET MVC.

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