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
правильно, но другие, которые я не думаю, необходимы.