คุณสมบัติ EditorFor () และ html


113

การสร้างตัวอย่าง Asp.Net MVC 2.0 ให้ตัวช่วยเช่น

Html.EditorFor(c => c.propertyname)

หากชื่อคุณสมบัติเป็นสตริงโค้ดด้านบนจะแสดงผลเป็น texbox

จะเกิดอะไรขึ้นถ้าฉันต้องการส่งผ่านคุณสมบัติ MaxLength และ Size ไปยังกล่องข้อความหรือคุณสมบัติคลาส css ของฉันเอง

ฉันต้องสร้างเทมเพลตหนึ่งรายการสำหรับการผสมขนาดและความยาวในแอปพลิเคชันของฉันหรือไม่ หากเป็นเช่นนั้นจะไม่ทำให้เทมเพลตเริ่มต้นใช้งานได้

คำตอบ:


92

ใน MVC3 คุณสามารถตั้งค่าความกว้างได้ดังนี้:

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

62
@vondip ตรวจสอบให้แน่ใจว่าเป็น TEXTBOX ไม่ใช่ตัวแก้ไข Doenst ทำงานร่วมกับบรรณาธิการ
Kasper Skov

1
นอกจากนี้ยังใช้งานได้กับ textareas: @ Html.TextAreaFor (c => c.PropertyName, new {style = "width: 500px;"})
Tarzan

โปรดทราบว่า TextBoxFor ไม่รองรับคำอธิบายประกอบข้อมูลบางส่วนซึ่งจะทำงานร่วมกับ EditorFor เช่น FormatString
AaronLS

14
คำตอบนี้ไม่ได้เพิกเฉยต่อคำถามโดยสิ้นเชิงนั่นคือฟังก์ชัน EditorFor-Template หรือไม่?
Philipp M

1
อย่างไรก็ตามการใช้ TextBoxFor จะปิดรูปแบบการแสดงผลที่ตั้งค่าเป็นคำอธิบายประกอบข้อมูล
Anders Lindén

61

ฉันแก้ไขสิ่งนี้โดยสร้าง 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 }) %>

ใช้งานได้เหมือนมีเสน่ห์สำหรับฉัน!


1
ยอดเยี่ยม - ฉันมีแบบเลื่อนลง datepicker DateTime ที่ฉันทำเทมเพลตไว้แล้ว แต่การส่งคุณสมบัติพิเศษไปให้มันเป็นการพิสูจน์ความเจ็บปวด - สิ่งนี้แก้ไขได้สำหรับฉันขอบคุณ!
Terry_Brown

EditorFor ที่มีความยาวสูงสุดไม่ได้ผลสำหรับฉัน (TextBoxFor ในอีกด้านหนึ่ง)
Drejc

@tjeerdhans ฉันใช้รหัสนี้เพื่อปรับแต่ง css ของฉัน มันใช้งานได้ แต่น่าเสียดายที่มันแทนที่ค่า css ดั้งเดิม ฉันจะทำให้มันต่อท้าย css เดิมแทนได้อย่างไร
Rosdi Kasim

33

ไม่มีคำตอบในหัวข้อนี้หรือหัวข้ออื่น ๆ เกี่ยวกับการตั้งค่าแอตทริบิวต์ HTML สำหรับ @ Html.EditorFor ช่วยฉันได้มาก อย่างไรก็ตามฉันพบคำตอบที่ดีที่

จัดแต่งทรงผม @ Html.EditorFor helper

ฉันใช้วิธีการเดียวกันและทำงานได้อย่างสวยงามโดยไม่ต้องเขียนโค้ดพิเศษมากมาย โปรดสังเกตว่าแอตทริบิวต์ 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 yyyy"

[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 #


1
ทำงานได้ดีสำหรับฉันเช่นกันใน MVC4
atconway

1
การจัดรูปแบบใช้งานได้ แต่ตอนนี้จะคืนค่าว่างสำหรับข้อมูลที่ปิดใช้งานกล่อง
โจ

2
ฉันไม่รู้ว่าคน MVC คืออะไรเหมือนว่าไม่มีใครเขียนเว็บไซต์ที่ทำงานกับหลายภาษาและรูปแบบสำหรับตัวเลข
adudley

ดีมาก. นี่เป็นเรื่องง่ายใช้งานได้จริงและตอบคำถามของ OP แทนการให้ทางเลือกอื่น ใช้ MVC4
draconis

คำเตือน: DateTimes ดูเหมือนว่าจะแสดงเป็น type = "datetime" ซึ่งผิดสำหรับวันเกิดและเบราว์เซอร์บางตัว (เช่น Firefox mobile) รองรับประเภทอินพุตนั้นอย่างถูกต้องรวมถึงส่วนประกอบเวลาที่อาจไม่ผ่านการตรวจสอบความถูกต้องและทำได้ยากหรือ เป็นไปไม่ได้ที่ผู้ใช้จะลบออก
brianary

25

อาจต้องการดูบล็อกโพสต์ของ Kiran Chandเขาใช้ข้อมูลเมตาที่กำหนดเองกับโมเดลมุมมองเช่น:

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

รวมกับเทมเพลตแบบกำหนดเองที่ใช้ประโยชน์จากข้อมูลเมตา วิธีการที่สะอาดและเรียบง่ายในความคิดของฉัน แต่ฉันอยากเห็นกรณีการใช้งานทั่วไปนี้ในตัวสำหรับ mvc


71
คุณล้อเล่น? นี่เป็นเรื่องที่มากเกินไปสำหรับสิ่งง่ายๆเช่นนี้ มากขึ้นเรื่อย ๆ ฉันจะกลับไปใช้ HTML บริสุทธิ์และลืมวิธีการช่วยเหลือ MVC 5 นาทีที่แล้วฉันมี Textbox ง่ายๆซึ่งเปิดตัว jquery datepicker ได้สำเร็จ ตอนนี้เพียงเพราะฉันต้องการเปลี่ยนวิธีจัดรูปแบบค่าวันที่ที่โหลดไว้ล่วงหน้าฉันต้องเปลี่ยนเป็น EditorFor แต่ตอนนี้ฉันไม่สามารถระบุแอตทริบิวต์ HTML ของตัวเองได้อีกโดยไม่ต้องเขียนวิธีการและตัวช่วยส่วนขยายแบบกำหนดเองที่ป่องมากเกินไปเหล่านี้ ช่างเป็นเรื่องตลก มันต้องมีวิธีที่ง่ายกว่านั้นคุณอาจารย์บ้าไม่รู้ว่าเมื่อไหร่ควรหยุด
Aaron

1
ฉันคิดว่าคุณกำลังผสมบริบท คุณจะมี EditorFor สองสายที่แตกต่างกันได้อย่างไรโดยแต่ละรายการจะได้รับขนาดและค่าความยาวสูงสุดของตัวเองพร้อมลิงก์ที่คุณให้มา หากคุณไม่ต้องการใช้ EditorFor คุณสามารถใช้ TextBox helper หรือ html แบบธรรมดาได้ตลอดเวลา แต่นั่นไม่ใช่คำถาม!
chandmk

@Aaron ณ MVC ล่าสุดคุณสามารถระบุแอตทริบิวต์ html เพิ่มเติมได้EditorForโดยส่งเป็น:new { htmlAttributes: { @class = "yourclass" } }
JoeBrockhaus

17

ฉันประหลาดใจที่ไม่มีใครพูดถึงการส่งผ่านใน "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"])) %>

จากสิ่งนี้ฉันได้สร้างตัวช่วยที่คำนึงถึงการรวมแอตทริบิวต์ - stackoverflow.com/a/11498094/79842
Colin Bowern

6

ปัญหาคือเทมเพลตของคุณสามารถมีองค์ประกอบ 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 ต้องการโซลูชันที่ดีกว่า ยังเป็นเบต้าอยู่ - ไปขอเลย ;-)


ฉันคิดว่าวิธีที่ดีกว่าในการจัดการกับสิ่งนี้คือตามที่ฉันได้กล่าวไว้ที่นี่stackoverflow.com/questions/1647609/… ... ในระยะสั้นการทำสิ่งที่คล้ายกับวิธีที่ WPF จัดการกับปัญหา ... องค์ประกอบรูปแบบโดยพลการ (ในกรณีนี้ แอตทริบิวต์) ส่งต่อไปยังเทมเพลตและเทมเพลตจะตัดสินใจว่าองค์ประกอบภายในใดที่จะใช้สไตล์กับ ...
vdhant

6

ฉันคิดว่าการใช้ 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>

โจ


สิ่งนี้ใช้ได้ดีมากสำหรับการควบคุมการเปลี่ยนแปลง CSS เฉพาะเมื่อใช้EditorForเทมเพลต ฉันใช้ MVC4 และใช้งานได้ดี
atconway

6

ใน MVC 5 หากคุณต้องการเพิ่มคุณสมบัติใด ๆ คุณสามารถทำได้

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

ข้อมูลที่พบจากบล็อกนี้


3

คุณสามารถกำหนดแอตทริบิวต์สำหรับคุณสมบัติของคุณ

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

นี้เรียกว่าSystem.ComponentModel.DataAnnotations. หากคุณไม่พบสิ่งValidationAttributeที่ต้องการคุณสามารถกำหนดแอตทริบิวต์ที่กำหนดเองได้ตลอดเวลา

ขอแสดงความนับถือ Carlos


3
เขาพูดถึง Html-attributes เช่น maxlength not validation
Mathias F

ฉันหวังว่าเอ็นจิ้นมุมมองจะปฏิบัติตาม DataAnnotations ด้วย ฉันยังไม่ได้ยุ่งกับ MVC2 เลย
mxmissile

ฉันลองใช้คำอธิบายประกอบข้อมูล StringLength มันใช้ไม่ได้กับ EditorFor
wayne.blackmon

3

นี่อาจไม่ใช่วิธีแก้ปัญหาที่เนียนที่สุด แต่ตรงไปตรงมา คุณสามารถเขียนส่วนขยายลงในคลาส HtmlHelper.EditorFor ในส่วนขยายนั้นคุณสามารถระบุพารามิเตอร์ตัวเลือกที่จะเขียนตัวเลือกไปยัง ViewData สำหรับผู้ช่วยเหลือ นี่คือรหัสบางส่วน:

ขั้นแรกวิธีการขยาย:

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

ถัดไปวัตถุตัวเลือก:

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.
}

และสุดท้ายนี่คือบรรทัดจากเทมเพลต String.ascx:

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

ตรงไปตรงมาฉันคิดว่านี่เป็นเรื่องที่ตรงไปตรงมาและชัดเจนสำหรับผู้ที่มีจิตใจยากจนที่ต้องรักษารหัสของคุณไว้ข้างทาง และง่ายต่อการขยายสำหรับข้อมูลอื่น ๆ ที่คุณต้องการส่งผ่านไปยังเทมเพลตของคุณ มันใช้งานได้ดีสำหรับฉันในโครงการที่ฉันพยายามรวมชุดเทมเพลตให้มากที่สุดเท่าที่จะทำได้เพื่อช่วยสร้างมาตรฐาน html โดยรอบ a la http://bradwilson.typepad.com/blog/2009/ 10


3

ฉันเขียนรายการบล็อกเพื่อตอบคำถามของตัวเอง

การเพิ่มการสนับสนุนแอตทริบิวต์ html สำหรับเทมเพลต - ASP.Net MVC 2.0 Beta


แนวคิดในการวางคุณสมบัติการจัดรูปแบบ HTML ในโมเดล (มุมมอง) นั้นขัดต่อแนวคิดของ MVC เพื่อแยกมุมมองและตรรกะ! จะเป็นอย่างไรหากโมเดลนั้นต้องการการนำเสนอที่แตกต่างกันใน HTML
saintedlama

2
@Saintedlama: มันสมบูรณ์ดีจะใส่คำอธิบายประกอบข้อมูลเกี่ยวกับViewModelเพราะวัตถุประสงค์เฉพาะ ViewModel คือการให้รูปแบบข้อมูลที่มีโครงสร้างสำหรับมุมมอง เพื่อไม่ให้สับสนกับmodelซึ่งในคำศัพท์ MVC มักแสดงถึงเอนทิตี DB ซึ่งไม่ควรมีคุณสมบัติที่เกี่ยวข้องกับการดู ต้องบอกว่าโชคไม่ดีที่คำอธิบายประกอบ viewmodel ของเขาเริ่มต้นด้วย HTMLxxx เพราะนั่นหมายความว่า HTML เป็นเลเยอร์การนำเสนอ แต่ต้องลากเส้นไว้ที่ไหนสักแห่ง :) นอกจากนี้หากเขานำ viewmodel มาใช้สำหรับแอป say silverlight เขาสามารถเพิ่มแอตทริบิวต์ SL ให้กับ viewmodel ได้อย่างง่ายดาย
Boris B.

3

ฉันไม่รู้ว่าทำไมมันใช้ไม่ได้กับ Html.EditorFor แต่ฉันลอง TextBoxFor แล้วมันใช้ได้กับฉัน

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

... และการตรวจสอบยังใช้ได้ผล


คุณต้องการ@class = "className"
JoeBrockhaus

2

ในทางปฏิบัติของฉันฉันพบว่าควรใช้ EditorTemplates กับ HtmlHelper เพียงตัวเดียว - กล่องข้อความซึ่งส่วนใหญ่แล้ว ถ้าฉันต้องการเทมเพลตสำหรับโครงสร้าง html ที่ซับซ้อนมากขึ้นฉันจะเขียน HtmlHelper แยกต่างหาก

ระบุว่าเราสามารถติดวัตถุ ViewData ทั้งหมดแทน htmlAttributes ของ TextBox นอกจากนี้เรายังสามารถเขียนโค้ดการปรับแต่งสำหรับคุณสมบัติบางอย่างของ ViewData ได้หากต้องการการดูแลเป็นพิเศษ:

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

ด้านล่างนี้เป็นตัวอย่างของไวยากรณ์ในมุมมองและ 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">

2

เพราะคำถามคือสำหรับEditorForไม่ได้ข้อเสนอแนะ TextBoxFor WEFX ไม่ทำงาน

สำหรับการเปลี่ยนช่องป้อนข้อมูลแต่ละช่องคุณสามารถประมวลผลผลลัพธ์ของวิธี EditorFor:

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

นอกจากนี้ยังสามารถเปลี่ยน EditorFors ทั้งหมดของคุณได้เนื่องจาก MVC ตั้งค่าคลาสของกล่องข้อความ EditorFor ด้วย. text-boxดังนั้นคุณสามารถแทนที่สไตล์นี้ในสไตล์ชีทหรือบนเพจได้

.text-box {
    width: 80em;
}

นอกจากนี้คุณสามารถตั้งค่ารูปแบบสำหรับ

input[type="text"] {
    width: 200px;
}
  • สิ่งนี้จะแทนที่. text-box และจะเปลี่ยนกล่องข้อความอินพุต EditorFor หรืออื่น ๆ

กล่องข้อความ EditorFor () ไม่ใช่ทั้งหมดที่เป็นประเภทอินพุต = "text" คุณสมบัติ DateTime ดูเหมือนจะแสดงเป็น type = "datetime"
brianary

2

ฉันมีปัญหากับการตั้งค่าความกว้างของ TextBox ใน MVC3 ในขณะที่การตั้งค่าแอตทริบิวต์ Clsss ใช้งานได้กับการควบคุม TextArea แต่ไม่ใช่สำหรับ TextBoxFor control หรือ EditorFor control:

ฉันลองทำตามแล้วและได้ผลสำหรับฉัน:

@ Html.TextBoxFor (model => model.Title ใหม่ {Class = "textBox", style = "width: 90%;"})

เช่นกันในกรณีนี้การตรวจสอบจะทำงานได้อย่างสมบูรณ์


2

วิธีหนึ่งที่คุณสามารถแก้ไขได้คือการให้ผู้ร่วมประชุมในโมเดลมุมมองจัดการพิมพ์การเรนเดอร์พิเศษเช่นนี้ ฉันทำสิ่งนี้สำหรับคลาสเพจจิ้งแล้วฉันเปิดเผยทรัพย์สินสาธารณะบนโมเดลFunc<int, string> RenderUrlเพื่อจัดการกับมัน

ดังนั้นกำหนดวิธีการเขียนบิตที่กำหนดเอง:

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

แสดงผลมุมมองสำหรับPagingคลาส:

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

... และสำหรับPagingมุมมองจริง:

@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>
}

อาจถูกมองว่าเป็นเรื่องที่ซับซ้อนเกินไป แต่ฉันใช้วิทยุติดตามตัวเหล่านี้ทุกที่และไม่สามารถทนเห็นรหัสต้นแบบเดียวกันเพื่อให้แสดงผลได้


1

อัปเดต: อืมเห็นได้ชัดว่าสิ่งนี้ใช้ไม่ได้เนื่องจากโมเดลถูกส่งผ่านค่าดังนั้นแอตทริบิวต์จะไม่ถูกเก็บรักษาไว้ แต่ฉันปล่อยให้คำตอบนี้เป็นไอเดีย

ฉันคิดว่าอีกวิธีหนึ่งคือการเพิ่มตัวช่วย TextBox / etc ของคุณเองซึ่งจะตรวจสอบคุณสมบัติของคุณเองในแบบจำลอง

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

อันนี้ง่ายกว่า แต่ไม่สะดวก / ยืดหยุ่นเท่า


1

นี่เป็นวิธีที่เรียบง่ายและสะอาดที่สุดในการหาทางออกที่นี่

บล็อกโพสต์ที่ยอดเยี่ยมและไม่มีความยุ่งเหยิงมากเกินไปในการเขียนส่วนขยาย / วิธีการช่วยเหลือที่กำหนดเองเช่นศาสตราจารย์ที่บ้าคลั่ง

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


0

ฉันชอบคำตอบของ @tjeerdans ซึ่งใช้ EditorTemplate ชื่อ String.ascx ในโฟลเดอร์ / Views / Shared / EditorTemplates ดูเหมือนว่าจะเป็นคำตอบที่ตรงไปตรงมาที่สุดสำหรับคำถามนี้ อย่างไรก็ตามฉันต้องการเทมเพลตที่ใช้ไวยากรณ์ของ Razor นอกจากนี้ดูเหมือนว่า MVC3 จะใช้เทมเพลต String เป็นค่าเริ่มต้น (โปรดดูคำถาม StackOverflow " เทมเพลตการแสดง mvc สำหรับสตริงใช้สำหรับจำนวนเต็ม ") ดังนั้นคุณต้องตั้งค่าโมเดลเป็นอ็อบเจ็กต์แทนที่จะเป็นสตริง เทมเพลตของฉันดูเหมือนจะใช้งานได้แล้ว:

@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})

0

แก้แล้ว !!
สำหรับ Razor ไวยากรณ์คือ:
@Html.TextAreaFor(m=>m.Address, new { style="Width:174px" })สิ่งนี้จะปรับความกว้างของพื้นที่ข้อความให้เป็นความกว้างที่ฉันกำหนดไว้ในพารามิเตอร์ style
สำหรับ ASPx ไวยากรณ์คือ:
<%=Html.TextAreaFor(m => m.Description, new { cols = "20", rows = "15", style="Width:174px" })%>
สิ่งนี้จะทำเคล็ดลับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.