我有一个模板编辑器Currency.cshtml
,如下所示:
@model decimal?
...
string value =
// Some calculations that returns value formatted as currency
Currency: @value<br/>
@Html.TextBox("", value, attributes)
我有一个使用此模板的视图:
@Html.EditorFor(m => m.Amount.Value, "Currency", someAdditionalViewData)
当此视图直接在另一个视图中呈现为部分时,结果如预期:文本和编辑器都显示格式化变量“value”,如下所示:
Currency: 1.223,18 <== well formatted
[ 1.223,18] <== this is the input type=text, well formatted
但是,如果我使用Ajax(Ajax.ActionLink
)获取视图,我会将第一部分格式化,但第二部分未格式化,如下所示:
Currency: 1.223,18 <== well formatted
[ 1223.18] <== this is the input type=text, not formatted!!
知道为什么会这样吗?我应该更改模板中的最终@Html.TextBox("", value, attributes)
以获取其他内容吗?
答案 0 :(得分:0)
我不知道原因,但在调查了一段时间之后,我可以确保在Ajax请求上对@Html.TextBox("", value, attributes)
的最终调用的行为方式与在PartialView渲染上的行为不同。
在PartialView渲染中,它使用提供的格式化值创建所需的输入元素。但是,在ajax请求中,它会查找模型上的信息并创建自己的文本框版本,包括不显眼的验证属性等。
解决此问题的唯一方法是不使用TextBox
方法,而是创建一个直接用TagBuilder
编写的输入。注意获取输入元素的Id和名称的方式。
@{
string value = ... // Format as desired
// Create the required attributes
// NOTE: HtmlAttributes is simply a custom "fluent" attribute builder,
// inherited from IDictionay<string,object>
var attributes = HtmlAttributes.Empty
.Add("type", "text")
.Add("value", value) // formatted value
.Add("id", ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(""))
.Add("name", ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(""))
.AddStyle("text-align", "right");
// You can add extra attributes, i.e. unobtrusive validation, provided by user...
var extraAttibutes = ...
attributes.Merge(extraAttributes);
// Use the tag builder to create the input
TagBuilder tb = new TagBuilder("input");
foreach (var attribute in attributes)
{
tb.Attributes.Add(attribute.Key, attribute.Value.ToString());
}
var textBox = tb.ToString(TagRenderMode.SelfClosing);
// Then, either write it directly to the writer...
ViewContext.Writer.Write(textBox);
}
@* ...or use Html.Raw *@
@Html.Raw(textBox)
当然,省略了很多细节(如何获得不显眼或标签的任何其他额外属性等)。最好的灵魂是发现行为从“完整”渲染和ajax请求渲染变化的原因。所有View元数据看起来完全相同,但以不同的方式工作。
答案 1 :(得分:0)
我还有一个部分视图,它使用了一个在最初加载页面时有效的editortemplate。但是,当使用ajax调用partial时,不使用editortemplate。
对我来说,我必须把它移到另一个文件夹:
发件人强> 查看/ [Controllername] / EditorTemplates
要强> 查看/共享/ EditorTemplates