Я пытаюсь получить правильное имя ввода, чтобы набор объектов в моей модели представления мог быть связан.
@{ViewData.TemplateInfo.HtmlFieldPrefix = listName;}
@Html.EditorFor(m => m, "DoubleTemplate", new {
Name = listName,
Index = i,
Switcher = (YearOfProgram >= i +1)
})
Как вы можете видеть здесь, я передаю listName в качестве префикса для моего шаблона, значение listName = MyItems.
И вот мой шаблон:
@model Web.Models.ListElement
@if (ViewData["Switcher"] != null)
{
var IsVisible = (bool)ViewData["Switcher"];
var index = (int)ViewData["Index"];
var thisName = (string)ViewData["Name"] + "[" + index + "].Value";
var thisId = (string)ViewData["Name"] + "_" + index + "__Value";
if (IsVisible)
{
@*<input type="text" value="@Model.Value" name="@thisName" id ="@thisId" class="cell@(index + 1)"/>*@
@Html.TextBoxFor(m => m.Value, new { @class ="cell" + (index + 1)})
@Html.ValidationMessageFor(m => m.Value)
}
}
но я обнаружил, что сгенерированное имя становится таким: MyItems.[0].Value
Он имеет одну дополнительную точку. Как я могу избавиться от этого?
Между прочим, я попытался вручную указать имя внутри шаблона и обнаружил, что имя переопределяется помощником Html.
Обновлять
Причина, по которой я должен вручную установить HtmlFieldPrefix, заключается в том, что имя свойства (MyItems, которое представляет собой список объектов) будет потеряно, когда MyItems будет передан из основного представления в частичное представление. К тому времени, как частичное представление вызвало мой шаблон и передало его в один объект в MyItems, сам шаблон не имеет возможности определить имя MyItems, так как оно было потеряно с момента последней передачи.
Вот почему я должен вручную установить имя префикса поля html. И я даже пытался использовать что-то похожее на отражение (но не переизбрание, я забыл имя), чтобы проверить имя переданного объекта и обнаружил, что он возвращает модель.
Обновление 2
Я попробовал подход Стивена и не могу найти html-помощник PartialFor().
Я даже пытался использовать это в своем основном представлении:
Html.Partial(Model, "_MyPartialView");
В частичном представлении:
@model MvcApplication1.Models.MyModel
<h2>My Partial View</h2>
@Html.EditorFor(m => m.MyProperty)
Вот мой шаблон:
@model MvcApplication1.Models.ListElement
@Html.TextBoxFor(m => m.Value)
Вот моя модель:
public class MyModel
{
private List<ListElement> myProperty;
public List<ListElement> MyProperty
{
get
{
if (myProperty == null)
{
this.myProperty = new List<ListElement>() { new ListElement() { Value = 12 }, new ListElement() { Value = 13 }, new ListElement() { Value = 14 }, new ListElement() { Value = 15 }, };
}
return this.myProperty;
}
set
{
this.myProperty = value;
}
}
}
public class ListElement
{
[Range(0, 999)]
public double Value { get; set; }
}
А вот мой контроллер:
public ActionResult MyAction()
{
return View(new MyModel());
}
Он генерирует для меня только необработанный текст (12131415) вместо требуемого текстового поля, заполненного 12 13 14 15.
Но если я указал имя шаблона, он выдает исключение:
The template view expecting ListElement, and cannot convert
List<ListElement> into ListElement.
public ListElement MyItems { get; set; }
? Если нет, как бы вы привязали это к обратной передаче? У вас есть ещеEditorTemplate
для typeofListElement
? - person   schedule 08.09.2014HtmlFieldPrefix
. Если вы используете васEditorTemplate
правильно, MVC сделает это за вас (вы не должны использовать перегрузку, которая принимает имя шаблона). - person   schedule 09.09.2014Switcher
но мы можем разобраться с этим после - person   schedule 09.09.2014Switcher
. Это свойствоListElement
или что-то основано на свойстве основной модели? - возможно, ответьте в ответе, и я обновлю его на основе вашего ответа - person   schedule 09.09.2014