2017-02-17 14 views
1

У меня есть представление, модель которого представляет собой список настраиваемых типов, и я хочу, чтобы изменения POST выполнялись только для одного элемента List (model [i]), , Это сам по себе POST работает, за исключением того, значение того, что первоначально в модели и не обновленное значение из входногоASP.NET Core POST для контроллера с одним элементом из модели списка представлений

View модельной Декларация

@model List<Translation2> 

типа Translation2 в (F #)

type Translation2 = { 
    Key: string; 
    RowKey: string; 
    Value: string; 
    English: string; 
} 

В Просмотр с одного объекта submit

@model List<Translation2> 

<form asp-controller="Home" asp-action="Translate" method="POST" > 
<table> 
    <thead> 
     <th> 
      <h2>Key</h2> 
     </th> 
     <th> 
      <h2>English</h2> 
     </th> 
     <th> 
      <h2>Translated</h2> 
     </th> 
    </thead> 
    <tbody> 
@for(var i = 0; i < Model.Count(); i++) 
{ 
     <tr> 
      <div> 
       <td class="key-col"> 
        <p style="font-size:large">@Model[i].Key</p> 
        @Html.HiddenFor(m => m[i].RowKey) 
       </td> 
       <td class="val-col"> 
        <input class="fill-void" type="text" asp-for="@Model[i].English" readonly /> 

       </td> 
       <td class="val-col"> 
        <input class="fill-void" type="text" asp-for="@Model[i].Value" /> 
       </td> 
       <td> 
        <a href="@Url.Action("Translate", "Home", new {[email protected][i].RowKey, [email protected][i].Key, [email protected][i].Value })" >Save Translation</a> 
       </td> 
      </div> 
     </tr> 
} 
    </tbody> 
</table> 
</form> 

Я также попытался просто P ОСТ весь список за ASP.NET Core 1.0 POST IEnumerable<T> to controller но получит

ArgumentNullException: Value cannot be null. 
Parameter name: source 

Count 

MoveNext in Translate.cshtml 

@for(var i = 0; i < Model.Count(); i++) 

вид с представлением весь список

@model List<Translation2> 

<form asp-controller="Home" asp-action="Translate" method="POST" > 
<table> 
    <thead> 
     <th> 
      <h2>Key</h2> 
     </th> 
     <th> 
      <h2>English</h2> 
     </th> 
     <th> 
      <h2>Translated</h2> 
     </th> 
    </thead> 
    <tbody> 
@for(var i = 0; i < Model.Count(); i++) 
{ 
     <tr> 
      <div> 
       <td class="key-col"> 
        <p style="font-size:large">@Model[i].Key</p> 
        @Html.HiddenFor(m => m[i].RowKey) 
       </td> 
       <td class="val-col"> 
        <input class="fill-void" type="text" asp-for="@Model[i].English" readonly /> 

       </td> 
       <td class="val-col"> 
        <input class="fill-void" type="text" asp-for="@Model[i].Value" /> 
       </td> 
       <td> 
        <button type="submit">Save Translation</button> 

       </td> 
      </div> 
     </tr> 
} 
    </tbody> 
</table> 
</form> 

Я действительно хотел бы знать, как решить обе стороны, если это возможно, но решение ибо либо будет делать в этот момент.

+0

не видя форму в условии экса mple. Как вы отправляете его в действие? Save is get a get – Nkosi

+0

Последний TD - это @Url.Действие, которое было для одного лица представить Существует также форма упаковки таблицу <форма жерех-контроллер = «Главная» жерех действия = «Перевести» метод = «POST»> который я использовал Чтобы отправить форму в целом – PhilWolf91

+0

Это действие выполняет GET, а не POST. значение в ссылке не изменяется после рендера при обновлении поля ввода. Предложение. оберните каждый 'tr' в его собственную форму, которая отправляется в действие, ожидающее единственную модель, а не коллекцию. – Nkosi

ответ

1

@Nkosi «s комментарий на OP правильный ответ

«Это действие делает GET и не столбу. Значение в ссылке не изменяется после визуализации при обновлении поля ввода .. Предложение обернуть каждый тр в своей собственной форме, которая подает в действие ожидая одной модели, а не сборник»

Исправленный код:

@for(var i = 0; i < Model.Count(); i++) 
{ 
    <form asp-controller="Home" asp-action="Translate" method="POST" > 
     <tr> 
      <div> 
       <td class="key-col"> 
        <p style="font-size:large">@Model[i].Key</p> 
        @Html.HiddenFor(m => m[i].RowKey) 
       </td> 
       <td class="val-col"> 
        <input class="fill-void" type="text" asp-for="@Model[i].English" readonly /> 

       </td> 
       <td class="val-col"> 
        <input class="fill-void" type="text" asp-for="@Model[i].Value" /> 
       </td> 
       <td> 
        <button type="submit">Save Translation</button> 
       </td> 
      </div> 
     </tr> 
    </form> 
} 

Все еще получаю ошибку ArgumentException: Тип 'Translation2' не имеет конструктора по умолчанию Имя параметра: type, но область действия этого вопроса решена.

Обновления: Частичная Fix ---

Добавили конструктор, однако он всегда использует конструктор по умолчанию, так что, когда я смотрю на значениях свойств после POST, все они говорят «DEFAULT»

type Translation2(key:string, rowKey:string, value:string, english:string) = 
    public new() = Translation2("DEFAULT", "DEFAULT", "DEFAULT", "DEFAULT") 
    member this.Key = key 
    member this.RowKey = rowKey 
    member this.Value = value 
    member this.English = English 

Update: Для записи --- усложняя конструктор не помогает ... это, кажется, эти значения не сняты с точки зрения ....

type Translation2(key:string, rowKey:string, value:string, english:string) = 
    let mutable k = key 
    let mutable r = rowKey 
    let mutable v = value 
    let mutable e = english 

    member this.Key with get() = k and set(value) = k <- value 
    member this.RowKey with get() = r and set(value) = r <- value 
    member this.Value with get() = v and set(value) = v <- value 
    member this.English with get() = e and set(value) = e <- value 

    public new() = Translation2("DEFAULT", "DEFAULT", "DEFAULT", "DEFAULT") 
+0

Вы не можете иметь форму в виде такого цикла - ваши формирующие элементы формы с индексаторами (например, '' поэтому он может не только возвращаться к параметру, который является коллекцией, но может работать только для первого элемента, потому что индекторы коллекции должны начинаться с нуля и быть последовательными. Что вы на самом деле пытаетесь сделать здесь? Имея несколько форм, нет смысла, поскольку –

+0

У меня есть список объектов, которые необходимо отобразить в представлении. Я хочу иметь возможность обновлять один объект из списка, передавая ему действие на контроллер. – PhilWolf91

+1

Создание всего этого дополнительного html (формы и входные данные) для каждого элемента является пустой тратой ресурсов. У вас либо есть одна форма, либо создаются элементы управления для всех элементов, и вы можете отправить обратно всю коллекцию (то есть пользователь может вносить изменения в несколько элементов). Или вы отображаете данные как простой текст (как в таблице) и используйте одну форму в диалоговом окне для редактирования строки данных. –