Добавить модель в модель, используя Html помощник HiddenFor C # MVC - PullRequest
0 голосов
/ 29 октября 2018

У меня есть модель как

public class Model
{
    public int Value { get; set; }
    public List<OtherModel> List { get; set; }
}

public class OtherModel
{
    public int Value1 { get; set; }
    public int Value2 { get; set; }
    public bool IsPropTrue { get; set; }
}

Я использую Model в представлении, где я циклически перебираю List, чтобы отобразить данные в таблице.

В зависимости от того, является ли одно из свойств (IsPropTrue) в OtherModel истинным или ложным, я хочу использовать помощник HiddenFor Html и отправлять данные на контроллер HttpPost.

@model Model                                       
@foreach (var item in Model.List)
{                                          
    if (item.IsPropTrue)
    {
        @Html.HiddenFor(model=> item.Value1)
        @Html.HiddenFor(model=> item.Value2) 
    } 
}                          

Я думаю, что это не работает, потому что я должен каким-то образом добавить эти свойства в OtherModel, который находится внутри Model; Но, как у меня сейчас, я добавляю свойства к Model.

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Если вы хотите отправить массив на сервер на основе модели, вы должны использовать индексатор в @ Html.HiddenFor.

@model WebApplication1.Models.MyModel

<form>
    @if (Model != null && Model.List != null)
    {
        for (int i = 0; i < Model.List.Count; i++)
        {
            if (Model.List[i].IsPropTrue)
            {
                @Html.HiddenFor(model => Model.List[i].Value1)
                @Html.HiddenFor(model => Model.List[i].Value2)
            }
        }
    }
    <button type="submit">submit</button>
</form>

если вы хотите узнать причину использования индексатора в модели, я рекомендую Как работает привязка модели списка MVC 4?

0 голосов
/ 29 октября 2018

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

В вашей папке Views / Shared создайте контроллер с именем EditorTemplates В этой папке добавьте частичное представление с именем OtherModel В этом представлении установите модель на OtherModel и установите Layout = null Добавьте три поля OtherModel в EditorFor (и HiddenFor, если не отображается isPropTrue). Этот частичный вид отображает только один экземпляр вашего списка.

В вашем главном представлении используйте приведенную выше модель редактора следующим образом. MVC позаботится обо всем рендеринге и обратной передаче модельного состояния для вашего полного списка элементов. Нам нравятся однострочники ...

@Html.EditorFor(model => model.OtherModel)

Когда данные впоследствии отправляются обратно в действие, Model State снова упаковывает все отображаемые элементы в список, поэтому вы можете проверить значение isPropTrue для каждого элемента на сервере.

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

0 голосов
/ 29 октября 2018

вы можете сделать это так:

@model Model                                       
@foreach (var item in Model.List)
{                                          
    if (item.IsPropTrue)
    {
        @Html.HiddenFor(model => model.List[Model.List.IndexOf(item)].Value1)
        @Html.HiddenFor(model => model.List[Model.List.IndexOf(item)].Value2)
    } 
} 

таким образом система привязки будет связывать скрытые поля с вашей моделью List OtherModel в модели

...