2010-03-22 2 views
1

Если вы посмотрите пример создания и редактирования ужинов NerdDinner, вы увидите, что они используют частичную (ViewUserControl или ASCX) DinnerForm для установки функциональности создания и редактирования обеды в один файл, потому что это очень важно, и они используют его с помощью RenderPartial («DinnerForm»).Редактирование и создание представления с использованием частичного редактирования EditCreate.ascx в ASP.NET MVC

Этот подход кажется прекрасным для меня, но у меня возникла проблема, когда вам нужно добавить дополнительные значения маршрута или свойства html в тег формы.

Это поднимает текущее действие и контроллер автоматически:

<% using (Html.BeginForm()) { %> 

Однако, если я использую другую BeginForm() перегрузки, которая позволяет передавать в ENCTYPE или любой другой атрибут я должен сделать это следующим образом:

<% using ("Create", "Section", new { modal = true }, FormMethod.Post, new { enctype = "multipart/form-data" })) 

, и, как вы можете видеть, мы теряем возможность автоматического обнаружения, в котором View мы вызываем RenderPartial («OurCreateEditFormPartial»). У нас не может быть жестко заданных значений, потому что в Edit View эта обратная передача завершится неудачно или не вернется к правильному действию контроллера.

Что делать в этом случае?

ответ

3

насчет добавления следующего HTML помощников:

public static MvcHtmlString CurrentAction(this HtmlHelper htmlHelper) 
    { 
     return htmlHelper.ViewContext.RouteData.Values["action"]; 
    } 

    public static MvcHtmlString CurrentController(this HtmlHelper htmlHelper) 
    { 
     return htmlHelper.ViewContext.RouteData.Values["controller"]; 
    } 

Тогда вы могли бы пойти что-то вроде этого:

<% using (Html.CurrentAction, Html.CurrentController, new { modal = true }, FormMethod.Post, new { enctype = "multipart/form-data" })) 

Это не 100% совершенного, но вы можете также добавить дополнительный помощник HTML который будет упростить его еще немного:

public static MvcForm BeginForm(this HtmlHelper htmlHelper, object routeValues, FormMethod method, object htmlAttributes) 
{ 
    return htmlHelper.BeginForm(Html.CurrentAction, Html.CurrentController, routeValues, method, htmlAttributes); 
} 

Сообщите мне, если это поможет. Приветствия

+0

это определенно помогает, но выглядит немного натянуто. Дело в том, что каждый день я сталкиваюсь с другим специальным случаем, когда мне приходится писать некоторые пользовательские помощники или расширения для достижения некоторых базовых функций, которые уже должны быть там, но, по-видимому, дизайнеры ASP.NET MVC его пропустили. Мне интересно, как долго это будет продолжаться со мной. ;) – mare

+0

90% «помощников» MVC, которые вы видите, плавающие вокруг сети или на SO, - это просто семантический сахар, который сокращает в противном случае длительные звонки. Команда MVC «пропустила» что-нибудь здесь. Большую часть времени вам нужно прямо перед вами, просто нужно знать, где искать. – jfar

+0

Я согласен с jfar ... 90% времени, когда он делает то, что я хочу, но мне нравится то, что я могу легко добавить функциональность, которая мне нужна, когда ее не существует, причем выше это точка в случае. – anthonyv

0

Я отвечаю в старой теме, потому что он придумал номер два на поиск Google, пока я искал то же самое :) Нашел на этот пост SO:

Html.BeginForm and adding properties

С MVC3 (не уверен в MVC2) вы можете передать значение null для действия и контроллера и получить маршруты по умолчанию, которые будет использовать BeginForm().

@Html.BeginForm(null, null, FormMethod.Post, new { enctype="multipart/form-data"}) 

Cheers!

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