MVC3 Установить значение по умолчанию для текстового поля из модели

У меня есть текстовое поле, созданное с помощью

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

Я хочу изменить значение по умолчанию этого текстового поля с "текст" на значение, хранящееся в поле модели. Как установить поле модели в качестве атрибута значения? Скажем, имя вызываемой модели - Model2, а атрибут - field2. Как мне установить значение текстового поля в field2?

3 ответа

Решение

Сначала вы должны написать метод расширения следующим образом:

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"});
    }

}

Вы можете установить значение по умолчанию внутри действия вашего контроллера непосредственно перед передачей модели в представление:

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

В вашем контроллере установите значение field1 перед передачей его в представление... и это автоматически установит значение. Если у вас есть значение в другом поле, просто выполните:

model.field1 = model.field2;

в вашем контроллере... и таким образом модели имеют согласованные данные.

Если вам не нужно / не нужно, чтобы значением по умолчанию являлось значение текстового поля, вы также можете использовать PlaceHolder... и таким образом пользователь может увидеть значение как подсказку, но оно не будет считаться содержимым текстового поля после публикации формы.

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

Помните, что не все имена полей в HtmlAttributes требуют "@"... @class правильно, но другие, которые я не думаю, необходимы.

Другие вопросы по тегам