Действия ASP.NET MVC с необязательными параметрами - PullRequest
0 голосов
/ 01 февраля 2010

У меня есть действие MVC на моем абстрактном BaseControlller , как это (и это действие является общим для всех наследующих контроллеров):

    //
    // GET: /controller/RenderForm/{formType}
    [Authorize(Roles = "Administrators")]
    public ActionResult RenderForm(FormType formType, BaseContentObject contentObject)
    {
        string constructPartialViewName = RouteData.Values["controller"] + "-" + formType + "Form";
        return PartialView(constructPartialViewName, contentObject);
    }

по этому маршруту:

        routes.MapRoute(
            "ContentObjectsFormRendering",
            RouteType.Regular,
            "{controller}/RenderForm/{formType}",
            new {controller = "", action = "RenderForm", formType = ""}, null
            );

Проблема возникает, когда я делаю запрос браузера, например:

~ / страница / RenderForm / Создать

Это запрос на создание формы Создать. Это делается из браузера - например, вводится URL-адрес. Здесь нет экземпляра BaseContentObject (обратите внимание, что это никогда не может быть предоставлено через браузер для Create, поскольку он всегда извлекается из хранилища данных в случае редактирования), и я думаю, что это его беспокоит. (Исключение составляет: Невозможно создать абстрактный класс.)

Но при выполнении RenderAction так:

    <%
        Html.RenderAction("RenderForm", ViewData.Model.ContentType.ToString(), new {formType = FormType.Edit, contentObject = ViewData.Model}); %>

визуализирует форму редактирования с подробностями из экземпляра BaseContentObject (при условии, через ViewData) просто отлично .

Если я удаляю параметр BaseContentObject contentObject из действия, то рендеринг Create работает нормально, но тогда я не могу предоставить параметр объекта содержимого во втором случае для Edit.

Как я могу решить это?

1 Ответ

1 голос
/ 01 февраля 2010

Поскольку ваш RenderForm является общим (в базовом контроллере), тогда MVC использует сигнатуру этого метода для создания экземпляров параметров. Это выглядит так:

  • действие - RenderForm (FormType formType, BaseContentObject contentObject)
  • есть данные формы, такие как "contentObject.Property", поэтому MVC необходимо создать экземпляр contentObject
  • типом для contentObject является BaseContentObject
  • BaseContentObject не может быть создан, поскольку он абстрактный

Ваша проблема в том, что вы думаете, что если вы переопределите RenderForm с другим / конкретным типом параметра contentObject, то будет использоваться новый тип параметра - но из того, что я вижу здесь, это неправильно. Будет использоваться сигнатура базового метода.

Решения:

  • переопределить DefaultModelBinder и настроить экземпляр там; Я не уверен, что вы можете обнаружить реальное действие / тип параметра, хотя;
  • не использовать общее базовое действие RenderForm; Извлечь необходимые общие функции в защищенный базовый метод (например, DoRenderForm) и вызывать его из реальных действий.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...