2014-02-26 4 views
5

Извините, если это было ранее, я не могу найти что-либо, что соответствует моей проблеме.MVC Отправить форму с частичным просмотром

У меня есть вид, который содержит частичный вид, а при представлении представления данные с частичного представления не отправляются на контроллер. Я понимаю, что если я использую шаблон редактора, это должно работать, но я не могу использовать это, поскольку мне нужны данные из моей основной модели внутри Partial.

Моя страница View (упрощенно):

@model CreateXmlSchemaModel 
@using (Html.BeginForm("Create", "XmlSchema", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <fieldset> 
     <div class="editor-label"> 
      @Html.LabelFor(m => m.XmlSchema.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(m => m.XmlSchema.Name) 
     </div> 
     <div id="fieldmapping"> 
      @Html.Partial("_XmlFieldMapping") 
     </div> 
     <div> 
      <input type="submit" value="Create" class="button" /> 
     </div> 
    </fieldset> 
} 

Моя структура модели (упрощенный):

public abstract class XmlSchemaModelContainerBase 
{ 
    public IEnumerable<string> BusinessObjects { get; set; } 
    public IEnumerable<XmlInputFieldModel> XmlFields { get; set; } 
    public IEnumerable<string> BusinessObjectFields { get; set; } 
} 

public class XmlSchemaModelContainer : XmlSchemaModelContainerBase 
{ 
    public XmlSchemaModel XmlSchema { get; set; } 
} 

public class XmlSchemaModel 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public string BusinessObject { get; set; } 
    public IEnumerable<XmlSchemaField> MappedFields { get; set; } 
} 

public class XmlSchemaField 
{ 
    public string XmlElement { get; set; } 
    public string BusinessObjectField { get; set; } 
} 

public class XmlInputFieldModel 
{ 
    public string XmlElement { get; set; } 
    public string XmlValue { get; set; } 
} 

public class CreateXmlSchemaModel : XmlSchemaModelContainer 
{ 
    [Required(ErrorMessage = "File upload required")] 
    public HttpPostedFileBase Xml { get; set; } 
} 

My Controller (я не буду размещать все это, как я могу сразу сказать, что мой ViewModel не содержит MappedFields):

[HttpPost] 
public ActionResult Create(CreateXmlSchemaModel viewModel) 
{ 
} 

Мои _XmlMappedFields Частичный вид:

@model CherwellXmlConnector.Models.XmlSchemaModelContainer 
@{ 
    Model.XmlSchema.MappedFields = Model.XmlSchema.MappedFields.OrderBy(i => i.XmlElement); 
} 

<div> 
    <div> 
     @for(int i = 0; i < @Model.XmlFields.Count(); i ++) 
     { 
      List<CherwellXmlConnector.Models.XmlSchemaField> fields = Model.XmlSchema.MappedFields.ToList(); 
      string itemValue = Model.XmlFields.FirstOrDefault(x => x.XmlElement == fields[i].XmlElement).XmlValue; 

      <div style="width: 300px; display: inline-block;"> 
       @Html.DisplayFor(x => fields[i].XmlElement) 
      </div> 
      <div style="width: 300px; display: inline-block;"> 
       @itemValue 
      </div> 
      <div class="busoblist" style="display: inline-block;"> 
       @Html.DropDownListFor(x => fields[i].BusinessObjectField, new SelectList(Model.BusinessObjectFields)) 
      </div> 
      <hr /> 
     } 
    </div> 
</div> 

Мое намерение состоит в том, чтобы показать пользователю в парциальное, список всех заданных XmlFields и их значения, и дать им возможность выбрать BusinessObjectField из выпадающего списка для каждого XmlField. Затем я хочу, чтобы это было отправлено обратно контроллеру внутри объекта IEnumerable<XmlSchemaField> MappedFields. Это возможно?

+0

Как правило, можно отправлять формы, содержащие частичные виды. Трудно ответить на ваш вопрос, не видя 1. Ваш контроллер, 2. Какой класс 'XmlInputFieldModel'. Можете ли вы доказать это? – Nilzor

+0

Также было бы полезно показать HTML, сгенерированный для частичного просмотра. Для вас самого, использование Fiddler для отладки данных POST также будет полезно – Nilzor

+0

@Nilzor, я добавил недостающие классы для вас – Mark

ответ

4

Да, это возможно.

Проблема, с которой вы сталкиваетесь, связана с тем, как работает привязка модели. Если бы это было всего лишь primitive type, которое вы пытаетесь связать для IEnumerable, то это сработало бы хорошо.

@foreach(var item in @Model.XmlSchema.MappedFields) 
    { 
     string itemValue = Model.XmlFields.FirstOrDefault(x => x.XmlElement == item.XmlElement).XmlValue; 
     <div style="width: 300px; display: inline-block;"> 
      @Html.DisplayFor(i => item.XmlElement) 
     </div> 
     <div style="width: 300px; display: inline-block;"> 
      @itemValue 
     </div> 
     <div class="busoblist" style="display: inline-block;"> 
      @Html.DropDownListFor(i => item.BusinessObjectField, new SelectList(Model.BusinessObjectFields)) 
     </div> 
     <hr /> 
    } 

, если вы посмотрите на исходный код, сгенерированный выше коде, вы увидите все dropdowns (select тегов), генерируемый из приведенного выше кода имеет то же имя. из-за этого он не будет привязан к вашей модели должным образом, когда вы отправляете форму.

После хороший блог, который я нашел очень полезным, и это объясняет подробно об этом

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

UPDATE

Для тех из вас, кто пришел сюда в поисках ответа на отправляя данные в список, я написал сообщение в блоге. http://amilaudayanga.wordpress.com/2014/03/05/posting-data-to-a-list-in-asp-net-mvc-part1/

+1

Просто добавьте к этому: измените цикл foreach на цикл и используйте старую школу вместо этого индексирование, и вам будет хорошо идти. – Nilzor

+0

@Amila Спасибо за это, и я следил за этой статьей, но мне, должно быть, недостает конечной связи или чего-то еще, поскольку она все еще не подходит к контроллеру. Я обновил свой пост выше с изменениями, которые я сделал. – Mark

+0

'@ Html.Partial (" _ XmlFieldMapping ")' Вы не передаете модель частичной.вы должны передать объект, который имеет тип 'CherwellXmlConnector.Models.XmlSchemaModelContainer' – Amila