0

我正在使用.NET4.5,MVC5和. 我有 ViewModel 集合。C#Visual Studio 2013UserInformation

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 中调试时,我将如何处理渲染控制?

4

0 回答 0