3

を使用して作成されたテキストボックスがあります

@Html.TextBoxFor(m => m.Model1.field1, new { @class = "login-input", @name="Name",  @Value = "test" })

このテキスト ボックスの既定値を "text" からモデル フィールドに格納されている値に変更したいと考えています。モデル フィールドを値属性として設定するにはどうすればよいですか? 呼び出されるモデルの名前が Model2 で、属性が field2 であるとします。テキストボックスの値を field2 に設定するにはどうすればよいですか?

4

3 に答える 3

1

最初に、次のような拡張メソッドを作成する必要があります。

public class ObjectExtensions
{
    public static string Item<TItem, TMember>(this TItem obj, Expression<Func<TItem, TMember>> expression)
    {
        if (expression.Body is MemberExpression)
        {
            return ((MemberExpression)(expression.Body)).Member.Name;
        }
        if (expression.Body is UnaryExpression)
        {
            return ((MemberExpression)((UnaryExpression)(expression.Body)).Operand).Member.Name;
        }
        if (expression.Body is ParameterExpression)
        {
            return expression.Body.Type.Name;
        }
        throw new InvalidOperationException();
    }
 }

次のように sth を記述すると、プロパティの Name が抽出されます。@Html.TextBoxFor(m => m.Model1.field1)

次に、次のように使用できます。

Html.TextBoxFor(m => m.Model1.field1, 
  new { @class = "login-input", 
        @name="Name",  
        @value = Model.Item(m => m.Model1.field1) })

再度呼び出したくない場合は、より複雑なm => m.Model1.field1バージョンのメソッドを宣言する必要がありますが、必要に応じて詳細を提供できます。TextBoxFor

これは、 Githubのコード ベースのサンプルです。

public static class HtmlHelperExtensionForEditorForDateTime
{

    public static MvcHtmlString Editor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);


        string propname = html.ViewData.Model.Item(expression);
        string incomingValue = null;
        var httpCookie = html.ViewContext.RequestContext.HttpContext.Request.Cookies["lang"];
        if (metadata.Model is DateTime && (httpCookie.IsNull() || httpCookie.Value == Cultures.Persian))
            incomingValue = PersianCalendarUtility.ConvertToPersian(((DateTime)metadata.Model).ToShortDateString());
        if (string.IsNullOrEmpty(incomingValue))
            return html.TextBox(propname, null, new { @class = "datepicker TextField" });

        return html.TextBox(propname, incomingValue, new { @class = "datepicker TextField"});
    }

}
于 2012-12-03T19:21:34.277 に答える
0

コントローラーでfield1、ビューに渡す前に値を設定します...これにより、値が自動的に設定されます。別のフィールドに値がある場合は、次のようにします。

model.field1 = model.field2;

コントローラーで...そして、モデルは一貫したデータを持っています。

デフォルト値が実際にテキストボックスの値である必要がない/したくない場合は、PlaceHolder... を使用することもできます。そうすれば、ユーザーは値をヒントとして見ることができますが、テキストボックスのコンテンツとしてはカウントされませんフォームを投稿したら。

@Html.TextBoxFor(m => m.Model1.field1, new { @class = "login-input", @name="Name",  placeholder= "test" })

HtmlAttributes のすべてのフィールド名に「@」が必要なわけではないことを覚えておいてください...@classこれは正しいですが、他のフィールド名は必要ないと思います。

于 2012-12-03T19:28:11.893 に答える