Я новичок в 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. *"
Как мне это преодолеть?
заранее спасибо
Возможно, вам лучше использовать отдельную модель для свойства 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");
}
в вашем файле бритвы добавьте следующий код @Html.EditorFor(model => model.NewItem.Name, new { htmlAttributes = new { @class= "form-control",@Name='name'} })
Просто измените подпись метода post на
HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(IndexViewModel model)
{
string name = model.NewItem.Name;
}
SListItem
имеет свойства, которые необходимо настроить в конструкторе (например,List
или аналогичный), то да, это хорошая идея. В противном случае вам не нужно предоставлять модель.