سؤال

Asp.Net MVC 2.0 معاينة يبني توفير المساعدين مثل

Html.EditorFor(c => c.propertyname)

إذا كان العقار هو اسم سلسلة ، رمز أعلاه يجعل texbox.

ما إذا كنت تريد أن تمر في MaxLength والحجم خصائص مربع النص أو بلدي فئة css الملكية ؟

هل أنا بحاجة إلى إنشاء قالب واحد لكل حجم و طول مجموعات في طلبي ؟ إذا كان هذا لا يجعل القوالب الافتراضية للاستخدام.

هل كانت مفيدة؟

المحلول 11

وكتبت بلوق الدخول للإجابة على سؤالي الخاص

<وأ href = "http://aspadvice.com/blogs/kiran/archive/2009/11/29/Adding-html-attributes-support-for-Templates-_2D00_-ASP.Net-MVC-2.0- Beta_2D00_1.aspx "يختلط =" نوفولو "> إضافة أتش تي أم أل سمات دعم قوالب - ASP.Net MVC 2.0 بيتا

نصائح أخرى

في MVC3، يمكنك تعيين العرض كما يلي:

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

وأنا تحل هذه عن طريق إنشاء EditorTemplate اسمه String.ascx في بلدي مجلد / مشاهدة / المشتركة / 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 }) %>

وتعمل مثل السحر بالنسبة لي!

وأي من الإجابات في هذا أو أي موضوع آخر في وضع HTML سمات @ Html.EditorFor كانت مساعدة كبيرة بالنسبة لي. ومع ذلك، لم أجد إجابة كبيرة في

التصميم و @Html.EditorFor المساعد

ولقد استخدمت نفس النهج وانها عملت بشكل جميل دون كتابة الكثير من رمز إضافية. لاحظ أن يتم تعيين سمة معرف من الناتج أتش تي أم أل من Html.EditorFor. رمز عرض

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

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

والخاصية نموذج مع الشرح البيانات والتنسيق التاريخ باسم "س س س س 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 الشفرة C #.

قد ترغب في النظر في <لأ href = "http://aspadvice.com/blogs/kiran/archive/2009/11/29/Adding-html-attributes-support-for-Templates-_2D00_-ASP.Net -MVC-2.0 Beta_2D00_1.aspx "يختلط =" noreferrer "> كيران تشاند مدونة آخر ، وقال انه يستخدم العرف الفوقية على نموذج عرض مثل:

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

ويتم الجمع بين هذا مع القوالب المخصصة التي تستفيد من البيانات الوصفية. وهناك نهج نظيفة وبسيطة في رأيي ولكن أود أن أرى هذه الحالة استخدام المشتركة المدمج في لبعثة التحقق المشتركة.

أنا مندهش لم يذكر أحد المارة في "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"])) %>

والمشكلة هي، القالب يمكن أن تحتوي على عدة عناصر 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 يحتاج إلى حل أفضل. انها لا تزال بيتا - تذهب تسأل عنه، -)

وأعتقد باستخدام 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>

وجو

وكما في MVC 5، إذا كنت ترغب في إضافة أية سمات يمكنك أن تفعل ببساطة

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

ومعلومات موجودة من هذا بلوق

ويمكنك تحديد سمات الممتلكات الخاصة بك.

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

وهذا هو المعروف باسم System.ComponentModel.DataAnnotations. إذا لم تتمكن من العثور على ValidationAttribute التي تحتاجها يمكنك تحديد لل Allways سمات مخصصة.

مع أطيب التحيات، كارلوس

وهذا قد لا يكون سليكست حل، لكنه واضح ومباشر. يمكنك كتابة امتدادا إلى فئة 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"] ?? "" }) %>

وبصراحة، أعتقد أن هذا واضح وصريح وواضح للفقراء الروح الذي لديه للحفاظ على التعليمات البرمجية الخاصة بك على الطريق. وأنه من السهل أن يمدد لمختلف أجزاء أخرى من المعلومات التي تريد تمريرها إلى القوالب الخاصة بك. انها تعمل بشكل جيد حتى الآن بالنسبة لي في مشروع حيث أحاول التفاف بقدر ما أستطيع في مجموعة من قالب للمساعدة في توحيد أتش تي أم أل المحيطة بها، على غرار <لأ href = "http://bradwilson.typepad.com /blog/2009/10/aspnet-mvc-2-templates-part-5-master-page-templates.html "يختلط =" نوفولو noreferrer "> http://bradwilson.typepad.com/blog/2009/10/ ASPNET-2-قوالب MVC-جزء-5-الماجستير-صفحة templates.html .

وأنا لا أعرف لماذا لا يعمل لHtml.EditorFor لكنني حاولت TextBoxFor وأنها عملت لي.

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

... وأيضا يعمل التحقق من الصحة.

في ممارستي لقد وجدت أنه من الأفضل استخدام EditorTemplates مع HtmlHelper واحد فقط في ذلك - وهذا هو مربع نص في معظم الحالات. إذا أريد نموذج لهيكل أتش تي أم أل أكثر تعقيدا، وسأكتب على HtmlHelper منفصل.

ونظرا لأننا يمكن أن عصا الكائن ViewData كله في مكان htmlAttributes مربع نص. وبالإضافة إلى ذلك يمكننا كتابة بعض الرموز التخصيص لبعض خصائص 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.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">

لأن السؤال هو 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 {
    width: 80em;
}

بالإضافة إلى ذلك, يمكنك تعيين نمط

input[type="text"] {
    width: 200px;
}
  • هذه التجاوزات .مربع النص و تغيير جميع المدخلات مربعات النص ، EditorFor أو غير ذلك.

أنا أيضا لدي مشكلة مع وضع عرض مربع نص في MVC3 ، في حين وضع Clsss السمة عملت TextArea التحكم ولكن ليس TextBoxFor التحكم أو EditorFor التحكم:

حاولت التالية التي عملت بالنسبة لي:

@Html.TextBoxFor(نموذج => نموذج.العنوان الجديد { Class = "textBox" ، على غرار = "width:90%;" })

أيضا في هذه الحالة التصديقات تعمل تماما.

وطريقة واحدة يمكن أن تحصل حوله هو وجود المندوبين على نموذج بغية التعامل مع طبع تقديم خاص من هذا القبيل. لقد فعلت ذلك لفئة الترحيل، وفضح الممتلكات العامة على 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>
}

ويمكن أن ينظر إليه على أنه أكثر تعقيد الأمور ولكن يمكنني استخدام هذه الاستدعاء في كل مكان، ولا يمكن الوقوف رؤية نفس رمز النمطي للحصول عليها المقدمة.

وUPDATE: جلالة الملك، من الواضح أن هذا لن ينجح لأنه يتم تمرير نموذج من حيث القيمة حتى لا يتم الاحتفاظ سمات. ولكن أترك هذا الجواب كفكرة.

وهناك حل آخر، كما أعتقد، سيكون لإضافة مربع نص الخاصة بك / الخ المساعدين، من شأنها أن تحقق للسمات الخاصة بك على نموذج.

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

وهذا هو واحد أسهل ولكن ليس CONVINIENT كما / مرونة.

وهذا هو أنظف وأكثر أناقة طريقة / بسيطة للحصول على حل هنا.

ورائعة بلوق وظيفة وليس مبالغة الفوضى في كتابة طرق مخصصة تمديد / المساعد مثل أستاذ جنون.

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

وأنا حقا أحبtjeerdans الجواب الذي يستخدم EditorTemplate اسمه String.ascx في / المشاهدات / مجلد المشتركة / EditorTemplates. يبدو أن الإجابة الأكثر إلى الأمام مباشرة على هذا السؤال. ومع ذلك، كنت أرغب في قالب باستخدام بناء الجملة الشفرة. وبالإضافة إلى ذلك، يبدو أن MVC3 يستخدم قالب سلسلة كقيمة افتراضية (انظر السؤال ستاكوفيرفلوو "<لأ href =" https://stackoverflow.com/questions/5038858/asp-net-mvc-display-template-for-strings -IS المستخدمة مقابل الأعداد الصحيحة "عنوان =" يستخدم قالب عرض بعثة التحقق المشتركة لسلاسل للصحيحة "> يتم استخدام قالب عرض بعثة التحقق المشتركة لسلاسل للصحيحة ") لذلك تحتاج إلى تعيين نموذج الاعتراض بدلا من سلسلة . يبدو قالب بلدي للعمل حتى الآن:

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

وأنا حلها !!
لالشفرة بناء الجملة هو:
@Html.TextAreaFor(m=>m.Address, new { style="Width:174px" }) هذا يضبط عرض منطقة النص إلى العرض الذي ط المحددة في المعلمة الاسلوب.
لASPX بناء الجملة هو:
<%=Html.TextAreaFor(m => m.Description, new { cols = "20", rows = "15", style="Width:174px" })%>
هذا سوف تفعل خدعة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top