2013-08-24 3 views
9

Я новичок в MVC 4 и бритве. У меня есть представление, которое содержит несколько частичных представлений. Из-за функциональности частичных представлений я планирую их повторно использовать и в других представлениях.MVC 4 Razor, Форма отправки с частичным видом

Моя модель представляет собой совокупность сложных объектов например:

public class EmployeeInfo 
    { 
     public EmployeeContactInfo contactInfo { get; set; } 
     public List<TelephoneInfo> phoneDetails { get; set; } 
     public AddressDetails addressDetails { get; set; } 
    } 

Модель моего основного зрения EmployeeInfo и другие частичные виды имеют модели как TelephoneInfo, EmployeeContactInfo и AddressDetails соответственно.

Я попытался с помощью RenderPartial, RenderAction и Partial загружать свои частичные виды например:

@using (Html.BeginForm()) 
    { 
    @Html.Partial("ContactInfo",Model.contactInfo) 
    } 

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

Я искал для этого и нашел ниже 2 предложенных решений:

  1. использования EditorFor - Он работает, и модель обновляется, но у меня есть коллекция не только текстовое поле, но и другие элементы управления, которые имеют некоторые внутренние операции (например, поиск адресов) тоже, и мне также нужно повторно использовать один и тот же частичный вид в других местах (например, пользовательский элемент управления в классическом ASP.NET)

  2. Используйте RenderAction вместо RenderPartial - Это не сработало для меня.

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

+0

Это может помочь: http://stackoverflow.com/questions/7687592/mvc3-partial-view-and-model-not-posting-back-changes –

ответ

18

Другого выбор заключается в создании editor template. Например, на главной странице:

@using (Html.BeginForm()) 
{ 
    @(Html.EditorFor(m => m.ContactInfo)) 
} 

Теперь в вашем Views/общей папки (или Views/ControllerName папки, например Views/Home), создайте новую папку с именем "EditorTemplates". В этой новой папке создайте файл представления cshtml с именем EmployeeContactInfo.cshtml (подсказка, имя cshtml должно быть именем типа данных, например string, bool или в этом случае вашим типом информации о ваших контактах). В этом файле вид, что-то вроде:

@model EmployeeContactInfo 

@Html.LabelFor(m => m.Email) 
@Html.TextBoxFor(m => m.Email) 

Когда вы размещаете на контроллер, значения будут включены как часть возвращаемой модели для вас.

+0

@indranilpal - Шаблоны редакторов похожи на частичные представления, за исключением того, что они предназначенные для использования в том виде, в котором вы хотите их использовать (как компоненты, используемые повторно). Он позволяет отображать компоненты на основе их типа, с соответствующими соглашениями об именах для поддержки сложных вложенных объектов. Он также поддерживает коллекции объектов, а также создает коллекцию. –

+0

@MystereMan - Точно, я хотел что-то, что я могу повторно использовать, я думаю, что шаблоны редактора сэкономит мой день. Спасибо JasonEvans и спасибо MysteryMan :) –

+0

Обратите внимание на точку с запятой в конце строки. Это не обязательно, на самом деле он печатает символ в HTML. Благодаря! – Diego

5

Проблема заключается в том, что ваша основная форма ожидает элементы с именем contactInfo.property, возможно, в вас частичные имена, которые вы генерируете, являются свойством без правильных идентификаторов, эта проблема создает проблемы с привязкой модели MVC по умолчанию. Вы можете создать настраиваемое связующее устройство, но с тяжелой работой, или у вас есть два пути решения вашей проблемы с меньшим количеством работы.

1. Силы имя создаваемого элемента

Например, если ваш EmployeeContactInfo класс содержит свойство строки Address вы должны использовать этот помощник:

@Html.TextBox("contactInfo.Address", model.Address) 

, что приводит к:

<input type="text" name="contactInfo.Address" id="contactInfo_Address" /> 

вместо:

@Html.TextBoxFor(m=> m.Address) 

, что приводит к:

<input type="text" name="Address" id="Address" /> 

2.Пройдите всю модель:

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

@Html.TextBoxFor(m=> m.contactInfo.Address) 

, что приводит к:

<input type="text" name="contactInfo.Address" id="contactInfo_Address" /> 
+0

Pass вся модель работает, я согласен, но для того, чтобы мнение было решено в других местах, я не хочу, чтобы другие представления создавали новую модель и отображали их фактические модели каждый раз. Я также думал о «имени» в управлении, но он не работает, если вы поместите его в список htmlAttributes, когда элементы управления визуализируются, имя возвращается обратно к имени свойства –

-2

Частичные Просмотр страницы действует как пользовательский элемент управления

  1. Здесь _login.cshtml частичный вид
  2. Если вы используете частичный вид, то подчеркивание следуют имя:

    <div style = "margin:3%;"> @Html.Partial("~/Views/Shared/_login.cshtml",Model.login)
    </div>

  3. Model.login - это объект. Таким образом, в этом объекте вы можете присвоить значение любой странице.

  4. Partial будет отображаться на основе значения объекта.

+0

Я считаю, что вы используете образец кода из проекта, а код as-is не помогает пользователю в этом конкретном вопросе – Zac

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