1

動的フォームを最初から作成したいのですが、すでに次の要素を作成しています。

表示したいすべてのフィールドを含むxmlファイル:

<?xml version="1.0" encoding="utf-8" ?>
<Fields>
    <FieldList>
        <Field>
            <Type>checkbox</Type>
            <Name>gender</Name>
            <DefaultValue>false</DefaultValue>
            <CssClass>myclass</CssClass>
        </Field>
        <Field>
            <Type>textbox</Type>
            <Name>name</Name>
            <DefaultValue>fill name</DefaultValue>
            <CssClass>formtextbox</CssClass>
        </Field>
    </FieldList>
</Fields>

xmlを逆シリアル化するために使用したクラスに入力されたビュー:

@model Fields
@{
    if(Model!=null)
    {
        using (Html.BeginForm())
        {
            foreach (Field field in Model.FieldList)
            {
                switch(field.Type)
                {
                    case "textbox":
                        @Html.TextBox(field.Name, field.DefaultValue);
                    break;

                    case "checkbox":
                        @Html.CheckBox(field.Name,Convert.ToBoolean(field.DefaultValue));
                    break;
                }
            }    
        }
    }
}

今のところアプリは正常に動作していますが、次の疑問があります。

1)ビューに多くのコードを配置する必要があるため、エレガントなソリューションではないと思いますか?

2)サーバー検証を追加したいと思います。私は通常、データアノテーションを使用しますが、送信する内容がわからないため、ここでは不可能だと思います。クラスインスタンスをその場で作成し、その場でデータ注釈を追加する方法はありますか?

3)投稿を処理する別のアクションとコントローラーを作成しました。私は自分のアクションを送信するときに何がパラメーターとして受け取られないのかわからないので、何も受け取りません。アクションからRequest.Formを使用する必要があると思いますか?

4

2 に答える 2

1

私が最初に考えたのは、XMLを取得してビューを生成するカスタムHtmlHelperメソッドを実装することでした。このように、ビューには1行のコードしかありません。
検証に関しては、DataAnnotationsModelValidatorProviderを拡張し、GetValidators()をオーバーライドして、適切と思われるパラメーターやポリシーに基づいて、デフォルトのMVCバリデーターや独自のバリデーターを挿入できます。これらはクライアント側にも伝播されます。

于 2012-08-07T13:02:54.950 に答える
0

複数のタイプを追加することをお勧めします:

abstract class Field {
     public string Name {get;set; }
}

class BooleanField : Field{
     public bool Value { get;set; }
}

class TextField : Field{
      public string ValidationRegEx { get; set }
      public string Value { get;set; }
}

や。。など。

また、タイプごとにエディターテンプレートを追加します

TextFieldの検証を追加するには、検証正規表現に一致する値をチェックするカスタム検証属性を作成できます。

于 2012-08-07T13:06:28.710 に答える