Bir girdiye bir sınıf eklemeye çalışıyorum.
Bu çalışmıyor:
@Html.EditorFor(x => x.Created, new { @class = "date" })
Bir girdiye bir sınıf eklemeye çalışıyorum.
Bu çalışmıyor:
@Html.EditorFor(x => x.Created, new { @class = "date" })
Yanıtlar:
Bir sınıf eklemek Html.EditorFor
, şablonunun içinde olduğu gibi bir anlam ifade etmez, birçok farklı etikete sahip olabilirsiniz. Bu yüzden sınıfı editör şablonunun içine atamanız gerekir:
@Html.EditorFor(x => x.Created)
ve özel şablonda:
<div>
@Html.TextBoxForModel(x => x.Created, new { @class = "date" })
</div>
ASP.NET MVC 5.1'den itibaren, sınıfına bir sınıf eklemek EditorFor
mümkündür (asıl soru ASP.NET MVC 3'ü belirtmiştir ve kabul edilen cevap yine de dikkate alınan en iyisidir).
@Html.EditorFor(x=> x.MyProperty,
new { htmlAttributes = new { @class = "MyCssClass" } })
Bkz: ASP.NET MVC 5.1'deki Yenilikler, Düzenleyici şablonları için Bootstrap desteği
Genel EditorFor için sınıf ayarlayamazsınız. İstediğiniz editörü biliyorsanız, hemen kullanabilirsiniz, orada sınıfı ayarlayabilirsiniz. Herhangi bir özel şablon oluşturmanıza gerek yoktur.
@Html.TextBoxFor(x => x.Created, new { @class = "date" })
Kullanabilirsiniz:
@Html.EditorFor(x => x.Created, new { htmlAttributes = new { @class = "date" } })
(En azından ASP.NET MVC 5 ile, ama ASP.NET MVC 3 ile nasıl olduğunu bilmiyorum.)
Aynı sinir bozucu sorun vardı ve tüm DateTime değerlerine uygulanan bir EditorTemplate oluşturmak istemiyordu (zaman zaman göstermek istiyorum, bir jQuery UI açılan takvim değil benim UI zamanlar vardı ). Araştırmamda karşılaştığım temel konular şunlardı:
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
, ancak özel "tarih seçici" sınıfını uygulamama izin vermez.Bu nedenle, aşağıdaki yararları olan özel HtmlHelper sınıfı oluşturdum:
Bu yöntem, bunu boş bir dize ile değiştirir.
public static MvcHtmlString CalenderTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
{
var mvcHtmlString = System.Web.Mvc.Html.InputExtensions.TextBoxFor(htmlHelper, expression, htmlAttributes ?? new { @class = "text-box single-line date-picker" });
var xDoc = XDocument.Parse(mvcHtmlString.ToHtmlString());
var xElement = xDoc.Element("input");
if (xElement != null)
{
var valueAttribute = xElement.Attribute("value");
if (valueAttribute != null)
{
valueAttribute.Value = DateTime.Parse(valueAttribute.Value).ToShortDateString();
if (valueAttribute.Value == "1/1/0001")
valueAttribute.Value = string.Empty;
}
}
return new MvcHtmlString(xDoc.ToString());
}
Ve date-picker
sonra takvimi oluşturmak için sınıf süslemeli nesneleri arayan JQuery sözdizimini bilmek isteyenler için işte burada:
$(document).ready(function () {
$('.date-picker').datepicker({ inline: true, maxDate: 0, changeMonth: true, changeYear: true });
$('.date-picker').datepicker('option', 'showAnim', 'slideDown');
});
DateTimePickerFor
ve birlikte temsil ettiğiniz modelin tarih alanı güncelleme [DataType(DataType.Date)]
veya [DataType(DataType.DateTime)]
? Ayrıca, diyelim, aa / gg / yyyy formuna da yerleştirebilirsiniz .ParseFormats(new string[] { "MM/dd/yyyy" })
(veya istediğiniz her şeyi kolayca değiştirebilirsiniz).
@MyHtmlHelpers.CalenderTextBoxFor(model => model.ExpirationDate)
. Bunu nasıl uygulayacağınız konusunda herhangi bir fikriniz var mı?
AdditionalViewData aracılığıyla bir sınıf veya diğer bilgileri sağlamak mümkündür - ben bir kullanıcı veritabanı alanlarına (propertyName, editorType ve editorClass) dayalı bir form oluşturmak için izin veriyorum.
İlk örneğinize dayanarak:
@Html.EditorFor(x => x.Created, new { cssClass = "date" })
ve özel şablonda:
<div>
@Html.TextBoxFor(x => x.Created, new { @class = ViewData["cssClass"] })
</div>
EditorFor
Özellikle yerleşik düzenleyici şablonları için, özellikleri bir şekilde etikete eklenecek olan anonim bir nesneye geçmenize izin veren herhangi bir geçersiz kılma yoktur. Kendi özel düzenleyici şablonunuzu yazmanız ve istediğiniz değeri ek görünüm verileri olarak iletmeniz gerekir.
@Html.EditorFor(m=>m.Created ...)
Metin kutusu için herhangi bir argümanın iletilmesine izin vermez
Nitelikleri bu şekilde uygulayabilirsiniz.
@Html.TextBoxFor(m=>m.Created, new { @class= "date", Name ="myName", id="myId" })
JQuery kullanarak kolayca yapabilirsiniz:
$("input").addClass("class-name")
İşte giriş etiketiniz
@Html.EditorFor(model => model.Name)
DropDownlist için bunu kullanabilirsiniz:
$("select").addClass("class-name")
Açılır Liste için:
@Html.DropDownlistFor(model=>model.Name)
Soru MVC 3.0'ı hedeflerken, sorunun MVC 4.0'da da devam ettiğini görüyoruz. MVC 5.0 artık htmlAttributes için yerel bir aşırı yük içeriyor.
Mevcut iş yerimde MVC 4.0 kullanmak zorunda kaldım ve JQuery entegrasyonu için bir css sınıfı eklemem gerekiyor. Bu sorunu tek bir uzantı yöntemi kullanarak çözdüm ...
Genişletme Yöntemi:
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
using System.Xml.Linq;
namespace MyTest.Utilities
{
public static class MVCHelperExtensionMethods
{
public static MvcHtmlString AddHtmlAttributes(this MvcHtmlString input, object htmlAttributes)
{
// WE WANT TO INJECT INTO AN EXISTING ELEMENT. IF THE ATTRIBUTE ALREADY EXISTS, ADD TO IT, OTHERWISE
// CREATE THE ATTRIBUTE WITH DATA VALUES.
// USE XML PARSER TO PARSE HTML ELEMENT
var xdoc = XDocument.Parse(input.ToHtmlString());
var rootElement = (from e in xdoc.Elements() select e).FirstOrDefault();
// IF WE CANNOT PARSE THE INPUT USING XDocument THEN RETURN THE ORIGINAL UNMODIFIED.
if (rootElement == null)
{
return input;
}
// USE RouteValueDictionary TO PARSE THE NEW HTML ATTRIBUTES
var routeValueDictionary = new RouteValueDictionary(htmlAttributes);
foreach (var routeValue in routeValueDictionary)
{
var attribute = rootElement.Attribute(routeValue.Key);
if (attribute == null)
{
attribute = new XAttribute(name: routeValue.Key, value: routeValue.Value);
rootElement.Add(attribute);
}
else
{
attribute.Value = string.Format("{0} {1}", attribute.Value, routeValue.Value).Trim();
}
}
var elementString = rootElement.ToString();
var response = new MvcHtmlString(elementString);
return response;
}
}
}
HTML İşaretleme Kullanımı:
@Html.EditorFor(expression: x => x.MyTestProperty).AddHtmlAttributes(new { @class = "form-control" })
(Genişletme yönteminin ad alanını ustura görünümüne eklediğinizden emin olun)
Açıklama:
Fikir, mevcut HTML'ye enjekte etmektir. Linq-to-XML kullanarak geçerli öğeyi ayrıştırmak için seçti XDocument.Parse()
. HtmlAttributes türünü iletiyorum object
. Ben RouteValueDictionary
htmlAttributes geçirilen ayrıştırmak için MVC kullanın. Ben zaten var olan öznitelikleri birleştirmek veya henüz yoksa yeni bir öznitelik ekleyin.
Tarafından durumunda giriş ayrıştırılabilir değil XDocument.Parse()
tüm umudunu terk edip orijinal giriş dizesi döndürür.
Şimdi DisplayFor (para birimi gibi veri türlerini uygun şekilde işleme) yararını kullanabilirsiniz ama aynı zamanda css sınıfları (ve bu konuda başka bir öznitelik) belirleme yeteneğine sahip. data-*
Veya ng-*
(Açısal) gibi özellikler eklemek için yardımcı olabilir .
Aynı davranışı, DateTime.cshtml adlı basit bir özel düzenleyici oluşturarak oluşturabilir ve Görünümler / Paylaşılan / Düzenleyici Şablonları'na kaydedebilirsiniz.
@model DateTime
@{
var css = ViewData["class"] ?? "";
@Html.TextBox("", (Model != DateTime.MinValue? Model.ToString("dd/MM/yyyy") : string.Empty), new { @class = "calendar medium " + css});
}
ve senin görüşlerine göre
@Html.EditorFor(model => model.StartDate, new { @class = "required" })
Örneğimde iki css sınıfını ve tarih formatını sabit kodladığımı unutmayın. Elbette bunu değiştirebilirsiniz. Aynı şeyi salt okunur, devre dışı bırakılmış vb.Gibi diğer html özellikleriyle de yapabilirsiniz.
İhtiyacınız olanı elde etmek için CSS özellik seçicileri kullanarak başka bir çözüm kullandım.
Bildiğiniz ve istediğiniz göreceli stile yerleştirdiğiniz HTML özelliğini belirtin.
Aşağıdaki gibi:
input[type="date"]
{
width: 150px;
}
MVC 4 için özel şablon oluşturmaya gerek yok . EditFor yerine TextBox kullanın Burada özel html öznitelikleri desteklenmez, sadece MVC 5'den desteklenir. TextBox MVC 4 için desteklemelidir, diğer sürüm hakkında bilmiyorum.
@Html.TextBox("test", "", new { @id = "signupform", @class = "form-control", @role = "form",@placeholder="Name" })
Bunu jQuery ile de yapabilirsiniz:
$('#x_Created').addClass(date);
Sadece bir sayfada bir metin kutusunun boyutunu ayarlamam gerekiyordu. Modeldeki kodlama nitelikleri ve özel editör şablonları oluşturmak aşırıya kaçmıştı, bu yüzden @ Html.EditorFor çağrısını, metin kutusunun boyutunu belirten bir sınıf adı verilen bir span etiketi ile tamamladım.
.SpaceAvailableSearch input
{
width:25px;
}
<span class="SpaceAvailableSearch">@Html.EditorFor(model => model.SearchForm.SpaceAvailable)</span>