В ASP.NET MVC создайте форму только для одного члена модели представления

1

Я новичок в ASP.NET MVC, и я пытаюсь создать страницу, в которой перечислены некоторые элементы, а также небольшая форма для создания нового элемента. Поэтому я создал эту модель представления:

//The view model has the list of items as AllItems and a member variable for creating a new item.
public class IndexViewModel
{
    public List<SListItem> AllItems { get; set; }

    //SListItem contains ID, Name and price
    public SListItem NewItem { get; set; }
}

В моем файле бритвы я добавляю строку:

@Html.EditorFor(model => model.NewItem.Name, new { htmlAttributes = new { @class = "form-control"} })

На выходе html он создает текстовый ввод с именем, установленным в "NewItem.Name" вместо "Name",

<input name="NewItem.Name" id="NewItem_Name" type="text" value="">

В контроллере, который получает данные POST, представленные через форму

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index([Bind(Include = "ID,Name,ItemType")] ShoppingListItem item)
{
}

Когда я запускаю его, параметр "item" не заполняется, потому что элементы формы имеют имя "NewItem. *"

Как мне это преодолеть?

заранее спасибо

Теги:
razor
asp.net-mvc
asp.net-mvc-4

3 ответа

2
Лучший ответ

Возможно, вам лучше использовать отдельную модель для свойства NewItem. Вы можете вызвать @Html.Action() чтобы отобразить форму для модели NewItem как дочернее действие индекса.

Ваш индексный вид будет выглядеть так:

@model Your.Namespace.IndexViewModel

<div>
    <!-- your index markup -->

    <!-- call this wherever the child view should render -->
    @Html.Action("whatever_you_name_the_action")
</div>

И ваше представление "edit" будет выглядеть так:

@model Your.Namespace.SListItem 

@Html.EditorFor(m => m.WhateverPropertyOfSListItemYoureAfter)

Вам просто нужно убедиться, что вы возвращаете PartialView а не View из дочернего действия. Если вы хотите иметь специальное действие контроллера, которое невозможно запросить напрямую, отметьте действие с помощью ChildActionOnlyAttribute. Например:

[ChildActionOnly]
public ActionResult Edit(int? id)
{
    return PartialView("_SListItemView");
}
  • 0
    Извините за задержку с ответом. Я попробовал это, и это прекрасно работает. Хотя я просто хочу добавить, что в действии «Правка» я возвращаю PartialView («_SlistItemView», новый SListItem ()); Спасибо!!
  • 0
    Если ваша модель SListItem имеет свойства, которые необходимо настроить в конструкторе (например, List или аналогичный), то да, это хорошая идея. В противном случае вам не нужно предоставлять модель.
1

в вашем файле бритвы добавьте следующий код @Html.EditorFor(model => model.NewItem.Name, new { htmlAttributes = new { @class= "form-control",@Name='name'} })

  • 0
    Можете ли вы объяснить свой ответ?
  • 0
    Спасибо! Этот тоже работает. Просто обратите внимание, что это не работает, когда вы устанавливаете @name = "name" Это должен быть регистр предложений \\ @ Name = "name"
Показать ещё 2 комментария
1

Просто измените подпись метода post на

HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(IndexViewModel model)
{
   string name = model.NewItem.Name;
}
  • 0
    этот решит вашу проблему. @UKM
  • 0
    Когда я делаю это, я получаю эту ошибку: Дополнительная информация: Тип сущности IndexViewModel не является частью модели для текущего контекста.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню