Fra*_*nva 7 asp.net-mvc-4 razor-2
我正在尝试输入正确的名称,以便我的视图模型上的对象集合可以被绑定.
@{ViewData.TemplateInfo.HtmlFieldPrefix = listName;}
@Html.EditorFor(m => m, "DoubleTemplate", new {
Name = listName,
Index = i,
Switcher = (YearOfProgram >= i +1)
})
Run Code Online (Sandbox Code Playgroud)
正如您在此处看到的,我将"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)
}
}
Run Code Online (Sandbox Code Playgroud)
但是我发现生成的名字变成了这个 - > MyItems.[0] .Value
它有一个额外的DOT
谁能告诉我如何摆脱它?
顺便说一句,我试图在模板中手动指定名称,发现名称被Html帮助程序覆盖.
所以请帮助解决如何摆脱额外的点.
谢谢
更新
嗨@StephenMuecke我必须手动设置HtmlFieldPrefix的原因是当MyItems从主视图传递到局部视图时,属性名称(MyItems是一个对象列表)将丢失.到那时,部分视图称为我的模板并传递给MyItems中的一个对象,模板本身无法找出MyItems的名称,因为它自上次"传入"以来已经丢失.这就是我必须手动设置html字段前缀名称的原因.我甚至尝试使用类似于反射的东西(但不是重新选择,我忘了名字)来检查传入的对象的名称并发现它返回"模型".
我希望我的解释对你有意义.
更新2
我尝试过Stephen的方法,但找不到html助手PartialFor().

我甚至试图在我的主视图中使用它:
Html.Partial(Model, "_MyPartialView");
Run Code Online (Sandbox Code Playgroud)
在部分视图中:
@model MvcApplication1.Models.MyModel
<h2>My Partial View</h2>
@Html.EditorFor(m => m.MyProperty)
Run Code Online (Sandbox Code Playgroud)
这是我的模板:
@model MvcApplication1.Models.ListElement
@Html.TextBoxFor(m => m.Value)
Run Code Online (Sandbox Code Playgroud)
这是我的模型:
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; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
public ActionResult MyAction()
{
return View(new MyModel());
}
Run Code Online (Sandbox Code Playgroud)
它只为我生成原始文本("12131415"),而不是填写12 13 14 15的通缉文本框
但是如果我指定了模板名称,它会抛出一个异常,说模板视图需要ListElement,并且不能将List转换为ListElement.
小智 6
没有必要设置HtmlFieldPrefix值.如果您使用EditorTemplate基于属性类型(并且没有模板名称)的MVC,MVC将正确命名元素.
假设模型
public class ListElement
{
public string Value { get; set; }
....
}
public class MyViewModel
{
public IEnumerable<ListElement> MyItems { get; set; }
....
}
Run Code Online (Sandbox Code Playgroud)
编辑模板(ListElement.cshtml)
@model YourAssembly.ListElement
@Html.TextBoxFor(m => m.Value)
Run Code Online (Sandbox Code Playgroud)
主要观点
@model YourAssembly.MyViewModel
...
@Html.EditorFor(m => m.MyItems) // note do not specify the template name
Run Code Online (Sandbox Code Playgroud)
这将呈现
<input type="text" name="MyItems[0].Value" ...>
<input type="text" name="MyItems[1].Value" ...>
....
Run Code Online (Sandbox Code Playgroud)
如果你想使用partial来做这件事,你可以将整个模型传递给partial
MyPartial.cshtml
@model @model YourAssembly.MyViewModel
@Html.EditorFor(m => m.MyItems)
Run Code Online (Sandbox Code Playgroud)
并在主视图中
@Html.Partial("MyPartial")
Run Code Online (Sandbox Code Playgroud)
或创建扩展方法
public static MvcHtmlString PartialFor<TModel, TProperty>(this HtmlHelper<TModel> helper,
Expression<Func<TModel, TProperty>> expression, string partialViewName)
{
string name = ExpressionHelper.GetExpressionText(expression);
object model = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).Model;
var viewData = new ViewDataDictionary(helper.ViewData)
{
TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = name }
};
return helper.Partial(partialViewName, model, viewData);
}
}
Run Code Online (Sandbox Code Playgroud)
并用作
@Html.PartialFor(m => m.MyItems, "MyPartial")
Run Code Online (Sandbox Code Playgroud)
在部分
@model IEnumerable<YourAssembly.ListElement>
@Html.EditorFor(m => m)
Run Code Online (Sandbox Code Playgroud)
我发现我可以更改模板中 HtmlFeildPrefix 的值。
所以我解决问题的方法就是直接在模板中为 HtmlFeildPrefix 分配正确的值,而不是在调用模板的页面中。
我希望它有帮助。
| 归档时间: |
|
| 查看次数: |
11987 次 |
| 最近记录: |