我们目前正在使用 Umbraco 版本 7.1.4 程序集:1.0.5261.28127 和 Contour 版本 3.0.26
我正在尝试使用从数据库中提取的信息填充轮廓表单,但依赖于用户 cookie(cookie 保存数据库中记录的主键)。
为了实现这一点,我正在考虑编写一个自定义字段类型(其中一堆,每个数据字段一个),它检查 cookie 发出 db 请求,然后用值(用户名/地址/等)填充文本框.
我设法将自定义设置添加到控件并让它显示在设计时填充的值,但我似乎无法在运行时修改该值。
如果相关,我很乐意发布代码,但我的问题是。我在吠叫错误的树吗?这是处理此问题的最佳方法还是会起作用?
任何指针都将受到欢迎
谢谢
编辑
谢谢蒂姆,我现在已经设法打破它,甚至不渲染控件(调试消息说 SVT 值不存在)。这只是(或应该)用当前日期/时间填充表单只是为了让某些东西正常工作。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Umbraco.Forms.Core;
using System.Web.UI.WebControls;
namespace Custom.FieldType
{
public class CustomTextfield : Umbraco.Forms.Core.FieldType
{
public CustomTextfield()
{
//Provider
this.Id = new Guid("b994bc8b-2c65-461d-bfba-43c4b3bd2915");
this.Name = "Custom Textfield";
this.Description = "Renders a html input fieldKey"; //FieldType
this.Icon = "textfield.png";
this.SVT = DateTime.Now.ToLongTimeString();
}
public System.Web.UI.WebControls.TextBox tb;
public List<Object> _value;
[Umbraco.Forms.Core.Attributes.Setting("SVT", description = "the SVT")]
public string SVT { get; set; }
public override WebControl Editor
{
get
{
tb.TextMode = System.Web.UI.WebControls.TextBoxMode.SingleLine;
tb.CssClass = "text gaudete";
if (_value.Count > 0)
tb.Text = _value[0].ToString();
SVT = DateTime.Now.ToLongTimeString();
tb.Text = tb.Text + SVT;
return tb;
}
set { base.Editor = value; }
}
public override List<Object> Values
{
get
{
if (tb.Text != "")
{
_value.Clear();
_value.Add(tb.Text);
}
return _value;
}
set { _value = value; }
}
public override string RenderPreview()
{
return
"<input type=\"text\" id=\"text-content\" class=\"text\" maxlength=\"500\" value=\"" + this.SVT + "\" />";
}
public override string RenderPreviewWithPrevalues(List<object> prevalues)
{
return RenderPreview();
}
public override bool SupportsRegex
{
get { return true; }
}
}
}
观点是
@model Umbraco.Forms.Mvc.Models.FieldViewModel
@{
var widthSetting = Model.AdditionalSettings.FirstOrDefault(s => s.Key.Equals("Width"));
string width = (widthSetting == null) ? null : widthSetting.Value;
var textSetting = Model.AdditionalSettings.FirstOrDefault(s => s.Key.Equals("SVT"));
string widthTXT = (textSetting == null) ? null : textSetting.Value;
}
<input type="text" name="@Model.Name" id="@Model.Id" class="text" maxlength="500"
value="@{if(!string.IsNullOrEmpty(widthTXT)){<text>@(SVT)</text>}}"
@{if(Model.Mandatory || Model.Validate){<text>data-val="true"</text>}}
@{if (Model.Mandatory) {<text> data-val-required="@Model.RequiredErrorMessage"</text>}}
@{if (Model.Validate) {<text> data-val-regex="@Model.InvalidErrorMessage" data-regex="@Model.Regex"</text>}}
/>
代码大部分是从在线教程拼凑而成的,这就是为什么命名很糟糕的原因,但是如果我能在客户端的文本框中填充一些东西,那么我可以开始重构过程(以及废弃这个演示版本并编写一个真实版本)
谢谢。
编辑2
由于 Tim 的指针,我能够修复停止视图加载的错误,新视图如下所示
@model Umbraco.Forms.Mvc.Models.FieldViewModel
@{
var textSetting = Model.AdditionalSettings.FirstOrDefault(s => s.Key.Equals("SVT"));
string widthTXT = (textSetting == null) ? null : textSetting.Value;
}
<input type="text" name="@Model.Name" id="@Model.Id" class="text" maxlength="500"
value="@{if(!string.IsNullOrEmpty(widthTXT)){<text>@(widthTXT)</text>}else{<text>Unknown</text>}}"
@{if(Model.Mandatory || Model.Validate){<text>data-val="true"</text>}}
@{if (Model.Mandatory) {<text> data-val-required="@Model.RequiredErrorMessage"</text>}}
@{if (Model.Validate) {<text> data-val-regex="@Model.InvalidErrorMessage" data-regex="@Model.Regex"</text>}}
/>
并且只在文本框中显示“未知”
再次感谢。