0

Я боролся с проектом уже пару дней, и в моей текущей итерации я решил использовать шаблон редактора.ASP MVC3 - Редактор Шаблон, возвращающий нулевые значения контроллеру в пост.

Оригинальная проблема возникла из основной таблицы, связанной со вторичной таблицей с помощью внешнего ключа в SQL. В ASP MVC, вторичная таблица представлена ​​со следующим полем:

[UIHint("BankListAgentId")] 
    public virtual ICollection<BankListAgentId> BankListAgentId { get; set; } 

Поскольку это объект коллекции, GET на странице «Edit» работает для каждого конкретного пункта, однако на всех коллекциях POSTBACK предметы неожиданно нулевые. Однако все остальные поля содержат правильные данные. Я пытаюсь использовать и редактор шаблона, однако элементы коллекции все еще возвращаются null.

Вот код, я использую в представлении

@model Monet.Models.BankListMaster 
@using (Html.BeginForm()) 
{ 
    <fieldset> 
     <legend>Stat(s) Fixed</legend> 
     <table id="fixedRows"> 
      <tr> 
       <th>State Code</th> 
       <th>Agent ID</th> 
       <th></th> 
      </tr> 

      @foreach (var item in Model.BankListAgentId) 
      {      

       if (!String.IsNullOrWhiteSpace(item.AgentId) && item.FixedOrVariable.Equals("Fixed")) 
       { 
        @Html.EditorFor(model => item)      

       } 
      } 
     </table> 
     <br /> 
     @Html.ActionLink("Add another", "BlankFixedRow", null, null, new { id = "addFixed" }) 
    </fieldset> 
} 

А вот шаблон редактора. Это имя BankListAgentId и сидит в папке с именем EditorTemplates в папке Views enter image description here

@model Monet.Models.BankListAgentId 

    <tr id="[email protected]"> 
     <td> 
      @Html.DropDownListFor(model => model.StateCode, 
       (SelectList)ViewBag.StateCodeList, Model.StateCode) 
     </td> 
     <td> 
      @Html.EditorFor(model => model.AgentId) 
      @Html.ValidationMessageFor(model => model.AgentId) 
     </td> 
     <td> 
      <a href="#" class="deleteRow">delete</a> 
     </td> 
     @*<td><a href="#" onclick="$('#[email protected]').parent().remove();" style="float:right;">Delete</a></td>*@ 
    </tr> 

Вот код из BankListMaster модели

public partial class BankListMaster 
{ 
    public BankListMaster() 
    { 
     this.BankListStateCode = new HashSet<BankListStateCode>(); 
     this.BankListAgentId = new HashSet<BankListAgentId>(); 
     this.BankListAttachments = new HashSet<BankListAttachments>(); 
    } 

    public int ID { get; set; } 
    public string BankName { get; set; } 

    public virtual ICollection<BankListStateCode> BankListStateCode { get; set; } 
    public virtual ICollection<BankListAttachments> BankListAttachments { get; set; } 

    [UIHint("BankListAgentId")] 
    public virtual ICollection<BankListAgentId> BankListAgentId { get; set; } 
} 

И, наконец, вот BankListAgentId модель

public partial class BankListAgentId 
{ 
    public string AgentId { get; set; } 
    public int ID { get; set; } 
    public string FixedOrVariable { get; set; } 
    public string StateCode { get; set; } 

    public virtual BankListMaster BankListMaster { get; set; } 
} 

EDIT

Пользователь должен будет иметь возможность динамически изменять список.

ответ

0

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

@for (int i = 0; i < Model.BankListAgentId.Count; i++) 
      {      
       if (!String.IsNullOrWhiteSpace(Model.BankListAgentId[i].AgentId) && Model.BankListAgentId[i].FixedOrVariable.Equals("Fixed")) 
       { 
        @Html.EditorFor(model => Model.BankListAgentId[i]) 
       } 
      } 

Вы также должны опубликовать свой принимающий ActionResult.

P.S. Но поскольку DaveA правильно указывает, что модель представляет собой ICollection, это вызовет проблемы. Не может ли быть IEnumerable?

+0

индекс для ICollection? Это нарушит время выполнения. –

+0

Хорошее место, Дейв. Благодарю. –

+0

Я не думаю, что IEnumerable может индексировать. Придется использовать IList. Единственная потенциальная проблема заключается в том, что NealR необходимо использовать foreach. –