我正在使用.NET4.5
,MVC5
和. 我有 ViewModel 集合。C#
Visual Studio 2013
UserInformation
public class UserInformation
{
[Required(ErrorMessage = "Please enter your first name"), Display(Name = "First name")]
[DataMember(IsRequired = true)]
[RegularExpression(@"^ *?[a-zA-Z]+[ a-zA-Z-_']*$", ErrorMessage = "Please enter First name with letters only")]
[StringLength(20, ErrorMessage = "Please enter a firstname with no more than 20 characters")]
public string Firstname { get; set; }
[Required(ErrorMessage = "Please enter your surname"), Display(Name = "Surname")]
[DataMember(IsRequired = true)]
[RegularExpression(@"^ *?[a-zA-Z]+[ a-zA-Z-_']*$", ErrorMessage = "Please enter Surname with letters only")]
[StringLength(20, ErrorMessage = "Please enter a surname with no more than 20 characters")]
public string Surname { get; set; }
}
在 Customer0 页面上呈现用户时,会添加数据注释,而 Customer1 则不会。
客户 0:
<input name="Customers[0].Firstname" class="tooltip form-control input valid" data-val="true" data-val-length="Please enter a firstname with no more than 20 characters" data-val-length-max="20" data-val-regex="Please enter First name with letters only" data-val-regex-pattern="^ *?[a-zA-Z]+[ a-zA-Z-_']*$" data-val-required="Please enter your first name" id="Customers[0].Firstname" maxlength="20" placeholder="Name" tabindex="" type="text" value="Matas">
客户 1:
<input name="Customers[1].Firstname" class="tooltip form-control input valid" id="Customers[1].Firstname" maxlength="20" placeholder="Name" tabindex="" type="text" value="sss">
我已经设法追踪到它在页面上呈现注释仍然存在的点
从即时窗口:
var attr3 = Model.Item1.GetType().GetProperties()[1].GetCustomAttributes(true);
{object[5]}
[0]: {System.ComponentModel.DataAnnotations.RequiredAttribute}
[1]: {System.Runtime.Serialization.DataMemberAttribute}
[2]: {System.ComponentModel.DataAnnotations.StringLengthAttribute}
[3]: {System.ComponentModel.DataAnnotations.RegularExpressionAttribute}
[4]: {System.ComponentModel.DataAnnotations.DisplayAttribute}
要进一步调查(按照字符串),下一步是立即渲染两个控件,看看我得到了什么。
当我尝试在即时窗口中呈现控件时
var s = Html.TextEditor(o => o.Item1.Firstname, new TextEditParameters { Id = string.Format("Customers[{0}].Firstname", Model.Item2), Name = string.Format("Customers[{0}].Firstname", Model.Item2), CssClasses = "input", Placeholder = "Firstname", Type = HtmlExtensions.TextEditorType.OnlyTextBox });
我显然得到
表达式不能包含 lambda 表达式
编辑: 产生控制的机制
在主要部分:
客户 0:
@Html.Partial("Unit/_Customer", new Tuple<UserInformation, int>(Model.Customers[0], 0))
客户 1:
@if (Model.Customers.Count > 1)
{
<li>
<h1 class="h1--blue">Your partners details</h1>
</li>
Html.RenderPartial("Unit/_Customer", new Tuple<UserInformation, int>(Model.Customers[1], 1));
}
在 _Customer 部分:
<div class="split-input--left">
@Html.TextEditor(o => o.Item1.Firstname, new TextEditParameters { Name = string.Format("Customers[{0}].Firstname", Model.Item2), Id = string.Format("Customers[{0}].Firstname", Model.Item2), CssClasses = "input ", Placeholder = "Name", Type = HtmlExtensions.TextEditorType.OnlyTextBox })
</div>
然后在html扩展中:
public static MvcHtmlString TextEditor<TModel, TValue>(this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression, TextEditParameters textEditParameters)
{
string editor;
switch (textEditParameters.Type)
{
case TextEditorType.Currency:
editor = "Inputs/CurrencyPrefixTextInput";
break;
case TextEditorType.Autocomplete:
editor = "Inputs/AutocompleteTextInput";
break;
case TextEditorType.Email:
editor = "Inputs/EmailTextInput";
break;
case TextEditorType.Tel:
editor = "Inputs/TelTextInput";
break;
case TextEditorType.OnlyTextBox:
editor = "Inputs/TextInputOnly";
break;
case TextEditorType.OnlyTextBoxCurrency:
editor = "Inputs/TextInputOnlyCurrency";
break;
default:
editor = "Inputs/TextInput";
break;
}
var member = expression.Body as MemberExpression;
var maxLength = 4096;
if (member != null)
{
var stringLengthAttr =
(member.Member.GetCustomAttributes(typeof (StringLengthAttribute), false).FirstOrDefault() as StringLengthAttribute);
if (stringLengthAttr != null)
maxLength = stringLengthAttr.MaximumLength;
}
var model = new
{
InputFormat = textEditParameters.Format,
HasHelp = textEditParameters.HasHelpText,
UniqueId = textEditParameters.Id ?? GetHtmlifiedId(html.IdFor(expression).ToString()),
PlaceHolder = textEditParameters.Placeholder,
MaxLength = maxLength,
textEditParameters.Annotation,
textEditParameters.HasTick,
textEditParameters.TabIndex,
textEditParameters.CssClasses,
textEditParameters.Name,
RangeErrorMessage = textEditParameters is CurrencyTextEditParameters ? ((CurrencyTextEditParameters) textEditParameters).RangeErrorMessage : null,
RangeValidation = textEditParameters is CurrencyTextEditParameters ? ((CurrencyTextEditParameters)textEditParameters).RangeValidation : null,
RegexValidation = textEditParameters is CurrencyTextEditParameters ? ((CurrencyTextEditParameters)textEditParameters).RegexValidation : null,
RegexErrorMessage = textEditParameters is CurrencyTextEditParameters ? ((CurrencyTextEditParameters)textEditParameters).RegexErrorMessage : null,
IsRequired = textEditParameters is CurrencyTextEditParameters && ((CurrencyTextEditParameters)textEditParameters).IsRequired,
RequiredErrorMessage = textEditParameters is CurrencyTextEditParameters ? ((CurrencyTextEditParameters)textEditParameters).RequiredErrorMessage : null,
};
return html.EditorFor(expression, editor, model);
}
然后它被传递到 TextInputOnly.cshtml 部分:
@Html.TextBoxFor(m => m, @ViewData["InputFormat"].ToString(), new { Name = ViewData["Name"], @class = string.Format("tooltip form-control {0}", ViewData["CssClasses"]), id = ViewData["UniqueId"].ToString(), @placeholder = ViewData["PlaceHolder"].ToString(), maxlength = ViewData["MaxLength"].ToString(), tabindex = ViewData["TabIndex"] })
@Html.ValidationMessageFor(m => m, null, new {@class = "field-validation-error", data_valmsg_for = ViewData["Name"]})
这是我正在调试仍然存在的属性的地方。
在 Visual Studio 2013 中调试时,我将如何处理渲染控制?