使用Ajax进行局部视图时不应用模板编辑器

时间:2013-06-17 17:09:21

标签: asp.net-mvc asp.net-mvc-4

我有一个模板编辑器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)以获取其他内容吗?

2 个答案:

答案 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