MVC3从模型设置Textbox的默认值

时间:2012-12-03 18:56:00

标签: asp.net-mvc-3 default-value html.textboxfor

我有一个使用

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

我想将此文本框的默认值从“text”更改为存储在模型字段中的值。如何将模型字段设置为值属性?假设要调用的模型的名称是Model2,属性是field2。如何将文本框的值设置为field2?

3 个答案:

答案 0 :(得分: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();
    }
 }

当你这样写时,它将提取属性的名称:@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"});
    }

}

答案 1 :(得分:0)

在控制器中,在将field1传递给视图之前设置model.field1 = model.field2;的值...并自动设置值。如果您在另一个字段中有值,请执行以下操作:

PlaceHolder

在您的控制器中......这样模型就具有一致的数据。

如果您不需要/希望默认值实际上是文本框的值,您也可以使用@Html.TextBoxFor(m => m.Model1.field1, new { @class = "login-input", @name="Name", placeholder= "test" }) ...这样,用户可以看到一个值作为提示,但是发布表单后,它不会被视为文本框内容。

@class

请记住,并非HtmlAttributes中的所有字段名都需要“@”... {{1}}是正确的,但其他我认为不需要。

答案 2 :(得分:0)

您可以在将模型传递给视图之前在控制器操作中设置默认值:

model.field1 = "Test"
return View(model)