Свойства EditorFor () и html - PullRequest
       47

Свойства EditorFor () и html

112 голосов
/ 26 октября 2009

Предварительные сборки Asp.Net MVC 2.0 предоставляют такие помощники, как

Html.EditorFor(c => c.propertyname)

Если имя свойства является строкой, код выше отображает текстовое поле.

Что если я хочу передать свойства MaxLength и Size в текстовое поле или в свое собственное свойство класса css?

Нужно ли создавать один шаблон для каждой комбинации размера и длины в моем приложении? Если это так, то шаблоны по умолчанию не будут использоваться.

Ответы [ 20 ]

91 голосов
/ 10 марта 2011

В MVC3 вы можете установить ширину следующим образом:

@Html.TextBoxFor(c => c.PropertyName, new { style = "width: 500px;" })
61 голосов
/ 11 июня 2010

Я решил эту проблему, создав EditorTemplate с именем String.ascx в моей папке / Views / Shared / EditorTemplates:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
<% int size = 10;
   int maxLength = 100;
   if (ViewData["size"] != null)
   {
       size = (int)ViewData["size"];
   }
   if (ViewData["maxLength"] != null)
   {
       maxLength = (int)ViewData["maxLength"];
   }
%>
<%= Html.TextBox("", Model, new { Size=size, MaxLength=maxLength }) %>

На мой взгляд, я использую

<%= Html.EditorFor(model => model.SomeStringToBeEdited, new { size = 15, maxLength = 10 }) %>

Работает как шарм для меня!

33 голосов
/ 01 февраля 2012

Ни один из ответов в этой или любой другой теме по настройке атрибутов HTML для @ Html.EditorFor мне не сильно помог. Тем не менее, я нашел отличный ответ на

Стилизация @ Html.EditorFor помощника

Я использовал тот же подход, и он прекрасно работал без написания большого количества дополнительного кода. Обратите внимание, что атрибут id выходного файла html объекта Html.EditorFor установлен. Код вида

<style type="text/css">
#dob
{
   width:6em;
}
</style>

@using (Html.BeginForm())
{
   Enter date: 
   @Html.EditorFor(m => m.DateOfBirth, null, "dob", null)
}

Свойство модели с аннотацией данных и форматированием даты как «dd MMM гггг»

[Required(ErrorMessage= "Date of birth is required")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd MMM yyyy}")]
public DateTime DateOfBirth { get; set; }

Работал как талисман без написания большого количества дополнительного кода. В этом ответе используется ASP.NET MVC 3 Razor C #.

25 голосов
/ 10 декабря 2009

Может захотеть посмотреть на пост в блоге Киран Чанда , он использует собственные метаданные для модели представления, такие как:

[HtmlProperties(Size = 5, MaxLength = 10)]
public string Title { get; set; }

Это в сочетании с пользовательскими шаблонами, которые используют метаданные. Чистый и простой подход, на мой взгляд, но я хотел бы видеть этот общий вариант использования встроенным в mvc.

17 голосов
/ 13 октября 2011

Я удивлен, что никто не упомянул о передаче его в "AdditionalViewData" и чтении с другой стороны.

Просмотр (с разрывами строк, для ясности):

<%= Html.EditorFor(c => c.propertyname, new
    {
        htmlAttributes = new
        {
            @class = "myClass"
        }
    }
)%>

Шаблон редактора:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>

<%= Html.TextBox("", Model, ViewData["htmlAttributes"])) %>
6 голосов
/ 27 октября 2009

Проблема в том, что ваш шаблон может содержать несколько элементов HTML, поэтому MVC не будет знать, к какому из них применить ваш размер / класс. Вы должны определить это сами.

Сделайте ваш шаблон производным от вашего собственного класса с именем TextBoxViewModel:

public class TextBoxViewModel
{
  public string Value { get; set; }
  IDictionary<string, object> moreAttributes;
  public TextBoxViewModel(string value, IDictionary<string, object> moreAttributes)
  {
    // set class properties here
  }
  public string GetAttributesString()
  {
     return string.Join(" ", moreAttributes.Select(x => x.Key + "='" + x.Value + "'").ToArray()); // don't forget to encode
  }

}

В шаблоне вы можете сделать это:

<input value="<%= Model.Value %>" <%= Model.GetAttributesString() %> />

По вашему мнению, вы делаете:

<%= Html.EditorFor(x => x.StringValue) %>
or
<%= Html.EditorFor(x => new TextBoxViewModel(x.StringValue, new IDictionary<string, object> { {'class', 'myclass'}, {'size', 15}}) %>

Первая форма будет отображать шаблон по умолчанию для строки. Вторая форма будет отображать пользовательский шаблон.

Альтернативный синтаксис использует свободный интерфейс:

public class TextBoxViewModel
{
  public string Value { get; set; }
  IDictionary<string, object> moreAttributes;
  public TextBoxViewModel(string value, IDictionary<string, object> moreAttributes)
  {
    // set class properties here
    moreAttributes = new Dictionary<string, object>();
  }

  public TextBoxViewModel Attr(string name, object value)
  {
     moreAttributes[name] = value;
     return this;
  }

}

   // and in the view
   <%= Html.EditorFor(x => new TextBoxViewModel(x.StringValue).Attr("class", "myclass").Attr("size", 15) %>

Обратите внимание, что вместо того, чтобы делать это в представлении, вы также можете сделать это в контроллере или, что гораздо лучше, в ViewModel:

public ActionResult Action()
{
  // now you can Html.EditorFor(x => x.StringValue) and it will pick attributes
  return View(new { StringValue = new TextBoxViewModel(x.StringValue).Attr("class", "myclass").Attr("size", 15) });
}

Также обратите внимание, что вы можете сделать базовый класс TemplateViewModel - общую основу для всех ваших шаблонов представления - который будет содержать базовую поддержку атрибутов / и т.д.

Но в целом я думаю, что MVC v2 нуждается в лучшем решении. Это все еще бета - иди спроси об этом; -)

6 голосов
/ 30 июля 2012

Я думаю, что использование CSS - это путь. Я хотел бы сделать больше с кодированием .NET, как в XAML, но в браузере CSS - король.

Site.css

#account-note-input { 
  width:1000px; 
  height:100px; 
} 

.cshtml

<div class="editor-label"> 
  @Html.LabelFor(model => model.Note) 
</div> 
<div class="editor-field"> 
  @Html.EditorFor(model => model.Note, null, "account-note-input", null) 
  @Html.ValidationMessageFor(model => model.Note) 
</div>

Джо

6 голосов
/ 22 декабря 2015

Как и в MVC 5, если вы хотите добавить какие-либо атрибуты, вы можете просто сделать

 @Html.EditorFor(m => m.Name, new { htmlAttributes = new { @required = "true", @anotherAttribute = "whatever" } })

Информация найдена из этого блога

3 голосов
/ 18 августа 2011

Я не знаю, почему это не работает для Html.EditorFor, но я попробовал TextBoxFor, и он работал для меня.

@Html.TextBoxFor(m => m.Name, new { Class = "className", Size = "40"})

... а также валидационные работы.

3 голосов
/ 25 декабря 2010

Я написал запись в блоге, чтобы ответить на мой собственный вопрос

Добавление поддержки атрибутов html для шаблонов - ASP.Net MVC 2.0 Beta

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...