【发布时间】:2014-11-01 10:02:18
【问题描述】:
我正在尝试获取正确的输入名称,以便可以绑定我的视图模型上的对象集合。
@{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
我尝试了 Stephen 的方法,但找不到 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吗? -
嗨 @StephenMuecke 是的,我的模型有 MyItems(MyViewModel 有 MyItems)。我将 MyViewModel 绑定到使用 PartialView _MyPartialView 的 MyView.cshtml 页面,这个局部视图使用模板。我说的是这个模板中属性名称的丢失。我找到了一个解决方案,但它可能不是最好的。
-
但是你不需要设置
HtmlFieldPrefix的值。如果您正确使用EditorTemplate,MVC 将为您执行此操作(您不应使用接受模板名称的重载)。 -
嗨@StephenMuecke 我已根据您的问题更新了我的帖子,请参阅我的更新部分。欢呼
-
我将很快发布一个答案,说明您如何做到这一点,但我有点不确定
Switcher是什么,但我们可以在之后解决这个问题
标签: asp.net-mvc-4 razor-2