EditorFor () и свойства HTML

Другой способ сделать параллель (многопоточную) МН / SQL, показывают здесь:

http://www.williamrobertson.net/documents/parallel-plsql-launcher.html

недостаток использования dbms_job или dbms_schedular - то, что Вы действительно не знаете, когда Ваши задачи закончены. Я считал, что Вы не беспокоитесь, но возможно Вы передумаете в будущем.

РЕДАКТИРОВАНИЕ:

Эта статья http://www.devx.com/dbzone/10MinuteSolution/20902/0/page/1 описывает иначе. Это использует dbms_job и dbms_alert. Предупреждения используются, чтобы сигнализировать, что работы делаются (сигнал обратного вызова).

112
задан WEFX 22 September 2011 в 13:38
поделиться

6 ответов

Вы можете определить атрибуты для своих свойств.

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

Это известно как System.ComponentModel.DataAnnotations . Если вы не можете найти ValidationAttribute , который вам нужен, вы всегда можете определить собственные атрибуты.

С уважением, Карлос

3
ответ дан 24 November 2019 в 02:48
поделиться

ОБНОВЛЕНИЕ: хм, очевидно, это не сработает, потому что модель передается по значению, поэтому атрибуты не сохраняются; но я оставляю этот ответ в качестве идеи.

Другим решением, я думаю, было бы добавление ваших собственных помощников 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)) %>

Это проще, но не так удобно /f flexible.

1
ответ дан 24 November 2019 в 02:48
поделиться

Проблема в том, что ваш шаблон может содержать несколько элементов 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
ответ дан 24 November 2019 в 02:48
поделиться

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

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

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

25
ответ дан 24 November 2019 в 02:48
поделиться

Возможно, это не самое удачное решение, но оно простое. Вы можете написать расширение для класса HtmlHelper.EditorFor. В этом расширении вы можете указать параметр options, который будет записывать параметры в 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, а-ля http: //bradwilson.typepad.com / blog / 2009/10 / aspnet-mvc-2-templates-part-5-master-page-templates.html .

3
ответ дан 24 November 2019 в 02:48
поделиться

Я решил эту проблему, создав 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 }) %>

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

61
ответ дан 24 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: