0

.NET4.5MVC5C#およびを使用していVisual Studio 2013ます。のコレクションを持つ ViewModel があり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 }); 私は明らかに得る

式にラムダ式を含めることはできません

編集: コントロールを生成するメカニズム

主な部分では:

顧客 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