Vra

Asp.Net MVC 2.0 voorskou bou verskaf helpers soos

Html.EditorFor(c => c.propertyname)

Indien die eiendom naam is string, die bo-kode lewer'n texbox.

Wat as ek wil om te slaag in Maxlengte en Grootte eienskappe van die teks boks of my eie css klas eiendom?

Moet ek doen om een te skep sjabloon vir elke grootte en lengte kombinasies in my aansoek?As dit so is, dit maak nie die standaard templates wat bruikbaar.

Was dit nuttig?

Oplossing 11

Ek het 'n blog inskrywing op my eie vraag beantwoord

Voeg html eienskappe ondersteuning vir Templates - ASP.Net MVC 2.0 Beta

Ander wenke

In MVC3, kan jy die breedte stel soos volg:

@Html.TextBoxFor(c => c.PropertyName, new { style = "width: 500px;" })

Ek opgelos hierdie deur die skep van 'n EditorTemplate vernoem String.ascx in my / Views / gids Gedeelde / 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 }) %>

Na my mening, ek gebruik

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

Werk soos 'n bom vir my!

Nie een van die antwoorde in hierdie of enige ander draad oor die opstel HTML skryf vir @ Html.EditorFor was baie help om my. Maar ek het te vind 'n groot antwoord op

Styling n @ Html.EditorFor helper

Ek gebruik dieselfde benadering en dit het gewerk pragtig sonder die skryf van 'n baie ekstra kode. Let daarop dat die id kenmerk van die HTML uitvoer van Html.EditorFor is ingestel. Die uitsig kode

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

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

Die eiendom model met data body en datum formaat as "dd MMM yyyy"

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

gewerk soos 'n bom sonder skryf van 'n hele klomp van die ekstra-kode. Hierdie antwoord gebruik ASP.NET MVC 3 Razor C #.

Mag wil om te kyk na Kiran Chand se blog post , gebruik hy persoonlike metadata op die oog model soos:

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

Dit is gekombineer met persoonlike templates wat gebruik maak van die metadata maak. 'N Skoon en eenvoudige benadering in my mening, maar ek wil graag van hierdie algemene gebruik geval ingeboude om MVC sien.

Ek is verbaas dat niemand het dit genoem in "additionalViewData" verby en lees dit aan die ander kant.

Beeld (met lyn breek, vir duidelikheid):

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

Redakteur sjabloon:

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

<%= Html.TextBox("", Model, ViewData["htmlAttributes"])) %>

Die probleem is, jou sjabloon kan verskeie HTML-elemente bevat, so MVC nie sal weet watter een om jou maat / klas toe te pas. Jy sal hê om dit self te definieer.

Maak jou sjabloon trek uit jou eie klas genoem 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
  }

}

In die sjabloon wat jy kan dit doen:

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

In jou siening wat jy doen:

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

Die eerste vorm sal verstek template vir string lewer. Die tweede vorm sal die persoonlike sjabloon maak.

Alternatiewe sintaksis gebruik vlot koppelvlak:

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) %>

Let daarop dat in plaas van om dit te doen in die oog, jy kan ook dit te doen in kontroleerder, of baie beter in die 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) });
}

Let ook op dat jy base TemplateViewModel klas kan maak - 'n gemeenskaplike grond vir al jou siening templates -. Wat basiese ondersteuning vir eienskappe sal bevat / ens

Maar in die algemeen dink ek MVC v2 het 'n beter oplossing. Dit is nog steeds beta - gaan vra vir dit; -)

Ek dink die gebruik van CSS is die pad om te gaan. Ek wens ek kon meer doen met NET kodering, soos in XAML, maar in die leser CSS is koning.

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>

Joe

As by MVC 5, as jy wil enige eienskappe voeg jy kan eenvoudig nie

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

Inligting gevind uit hierdie blog

Jy kan definieer attribute vir jou eienskappe.

[StringLength(100)]
public string Body { get; set; }

Dit is bekend as System.ComponentModel.DataAnnotations.As jy nie kan vind die ValidationAttribute wat jy nodig het kan jy altyd definieer persoonlike eienskappe.

Beste Groete, Carlos

Dit is dalk nie die slickest oplossing wees, maar dit is eenvoudig. Jy kan 'n uitbreiding van die HtmlHelper.EditorFor klas skryf. In daardie verlenging, kan jy 'n opsies parameter wat die opsies om die ViewData vir die helper sal skryf voorsien. Hier is 'n paar kode:

In die eerste plek die uitbreiding metode:

public static MvcHtmlString EditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, TemplateOptions options)
{
    return helper.EditorFor(expression, options.TemplateName, new
    {
        cssClass = options.CssClass
    });
}

Volgende, die opsies beswaar:

public class TemplateOptions
{
    public string TemplateName { get; set; }
    public string CssClass { get; set; }
    // other properties for info you'd like to pass to your templates,
    // and by using an options object, you avoid method overload bloat.
}

En laastens, hier is die lyn van die String.ascx sjabloon:

<%= Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class = ViewData["cssClass"] ?? "" }) %>

Om eerlik te wees, ek dink dit is eenvoudig en duidelik aan die arme siel wat na jou kode in die pad af in stand te hou. En dit is maklik om uit te brei vir verskeie ander stukkies inligting wat jy wil om te slaag om jou templates. Dit is goed gewerk tot dusver vir my in 'n projek waar ek probeer om te draai so veel as wat ek kan in 'n stel van sjabloon om te help standaardiseer die omliggende html, a la http://bradwilson.typepad.com/blog/2009/10/ Aspnet-MVC-2-templates-deel-5-meester-bladsy-templates.html .

Ek weet nie hoekom dit nie vir Html.EditorFor werk nie, maar ek probeer TextBoxFor en dit het gewerk vir my.

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

... en ook werk bekragtiging.

In my praktyk het ek gevind dat dit die beste om EditorTemplates gebruik met net een HtmlHelper in dit - teksboks wat in die meeste gevalle. As ek wil 'n sjabloon vir meer komplekse html struktuur, sal ek 'n aparte HtmlHelper skryf.

Gegewe dat ons die hele ViewData voorwerp kan hou in die plek van htmlAttributes van die teksboks. Daarbenewens kan ons 'n paar aanpassing kode vir 'n paar van die eienskappe van die ViewData skryf as hulle spesiale behandeling nodig:

@model DateTime?
@*
    1) applies class datepicker to the input;
    2) applies additionalViewData object to the attributes of the input
    3) applies property "format" to the format of the input date.
*@
@{
    if (ViewData["class"] != null) { ViewData["class"] += " datepicker"; }
    else { ViewData["class"] = " datepicker"; }
    string format = "MM/dd/yyyy";
    if (ViewData["format"] != null)
    {
        format = ViewData["format"].ToString();
        ViewData.Remove("format");
    }
}

@Html.TextBox("", (Model.HasValue ? Model.Value.ToString(format) : string.Empty), ViewData)

Hier is die voorbeelde van die sintaksis in die oog en die outputted html:

@Html.EditorFor(m => m.Date)
<input class="datepicker" data-val="true" data-val-required="&amp;#39;Date&amp;#39; must not be empty." id="Date" name="Date" type="text" value="01/08/2012">
@Html.EditorFor(m => m.Date, new { @class = "myClass", @format = "M/dd" })
<input class="myClass datepicker" data-val="true" data-val-required="&amp;#39;Date&amp;#39; must not be empty." id="Date" name="Date" type="text" value="1/08">

As gevolg van die vraag is vir EditorFor nie TextBoxFor WEFX se voorstel nie werk nie.

Vir die verandering van individuele insette bokse, kan jy die uitset van die EditorFor metode verwerk:

<%: new HtmlString(Html.EditorFor(m=>m.propertyname).ToString().Replace("class=\"text-box single-line\"", "class=\"text-box single-line my500pxWideClass\"")) %>

Dit is ook moontlik om al jou EditorFors verander as dit blyk MVC stel die klas van EditorFor teks bokse met .text-boks , dus jy kan net ignoreer hierdie styl, in jou style of op die bladsy.

.text-box {
    width: 80em;
}

Verder kan jy die styl vir

input[type="text"] {
    width: 200px;
}
  • oorheers .text-boks en sal alle insette teks bokse te verander, EditorFor of andersins.

Ek het ook n probleem met die opstel van die wydte van teksboks in MVC3, terwyl die opstel van die Clsss kenmerk gewerk vir textarea beheer, maar nie vir TextBoxFor beheer of EditorFor beheer:

Ek het probeer volgende & wat vir my gewerk het:

 @ Html.TextBoxFor (model => model.Title, nuwe {class = "teksboks", style = "width: 90%;"})

ook in hierdie geval validations is perfek werk.

Een manier waarop jy kan kry ronde dit is deur afgevaardigdes op die oog model te hanteer druk uit spesiale lewering soos hierdie.Ek het dit gedoen vir'n blaai klas, het ek bloot'n openbare eiendom op die model Func<int, string> RenderUrl om te gaan met dit.

So bepaal hoe die persoonlike bietjie sal geskryf word:

Model.Paging.RenderUrl = (page) => { return string.Concat(@"/foo/", page); };

Die uitset van die oog vir die Paging klas:

@Html.DisplayFor(m => m.Paging)

...en vir die werklike Paging kyk:

@model Paging
@if (Model.Pages > 1)
{
    <ul class="paging">
    @for (int page = 1; page <= Model.Pages; page++)
    {
        <li><a href="@Model.RenderUrl(page)">@page</a></li>
    }
    </ul>
}

Dit kan gesien word as oor-bemoeilik sake maar ek gebruik hierdie piepers oral en kon nie bly staan nie die sien van die dieselfde boiler kode om hulle te kry gelewer.

UPDATE: hm, natuurlik sal dit nie werk nie, want model word geslaag deur waarde so eienskappe nie bewaar; maar ek laat dit antwoord as 'n idee.

Nog 'n oplossing, dink ek, sou wees om jou eie teksboks / ens helpers, wat sal gaan vir jou eie kenmerke van die model te voeg.

public class ViewModel
{
  [MyAddAttribute("class", "myclass")]
  public string StringValue { get; set; }
}

public class MyExtensions
{
  public static IDictionary<string, object> GetMyAttributes(object model)
  {
     // kind of prototype code...
     return model.GetType().GetCustomAttributes(typeof(MyAddAttribute)).OfType<MyAddAttribute>().ToDictionary(
          x => x.Name, x => x.Value);
  }
}

<!-- in the template -->
<%= Html.TextBox("Name", Model, MyExtensions.GetMyAttributes(Model)) %>

Hierdie een is makliker, maar nie as convinient / buigsaam.

Dit is die skoonste en mees elegante / eenvoudige manier om 'n oplossing hier kry.

Brilliant blog post en geen vuil overkill skriftelik persoonlike verlenging / helper metodes soos 'n mal professor.

http: // geekswithblogs.net/michelotti/archive/2010/02/05/mvc-2-editor-template-with-datetime.aspx

Ek het regtig gehoop @tjeerdans antwoord wat die EditorTemplate vernoem String.ascx in die / Views / Gedeelde / EditorTemplates gids gebruik. Dit lyk vir die meeste reguit-vorentoe antwoord op hierdie vraag wees. Maar ek wou 'n sjabloon met behulp van Razor sintaksis. Daarbenewens blyk dit dat MVC3 gebruik die String sjabloon as 'n standaard (sien die StackOverflow vraag " MVC vertoning sjabloon vir strykers gebruik vir heelgetalle "), sodat jy nodig het om die model te stel om eerder beswaar as string . My sjabloon lyk tot dusver werk:

@model object 

@{  int size = 10; int maxLength = 100; }

@if (ViewData["size"] != null) {
    Int32.TryParse((string)ViewData["size"], out size); 
} 

@if (ViewData["maxLength"] != null) {
    Int32.TryParse((string)ViewData["maxLength"], out maxLength); 
}

@Html.TextBox("", Model, new { Size = size, MaxLength = maxLength})

Ek opgelos dit !!
Vir Razor die sintaksis is:
@Html.TextAreaFor(m=>m.Address, new { style="Width:174px" }) hierdie verstel die teks area breedte aan die wydte wat ek gedefinieer in die parameter styl.
Vir ASPX die sintaksis is:
<%=Html.TextAreaFor(m => m.Description, new { cols = "20", rows = "15", style="Width:174px" })%>
dit sal die truuk doen

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top