Другой способ сделать параллель (многопоточную) МН / 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
. Предупреждения используются, чтобы сигнализировать, что работы делаются (сигнал обратного вызова).
Вы можете определить атрибуты для своих свойств.
[StringLength(100)]
public string Body { get; set; }
Это известно как System.ComponentModel.DataAnnotations
.
Если вы не можете найти ValidationAttribute
, который вам нужен, вы всегда можете определить собственные атрибуты.
С уважением, Карлос
ОБНОВЛЕНИЕ: хм, очевидно, это не сработает, потому что модель передается по значению, поэтому атрибуты не сохраняются; но я оставляю этот ответ в качестве идеи.
Другим решением, я думаю, было бы добавление ваших собственных помощников 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.
Проблема в том, что ваш шаблон может содержать несколько элементов 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 нуждается в лучшем решении.
Возможно, вы захотите взглянуть на сообщение в блоге Кирана Чанда , он использует настраиваемые метаданные в модели представления, например:
[HtmlProperties(Size = 5, MaxLength = 10)]
public string Title { get; set; }
Это сочетается с настраиваемыми шаблонами, которые используют метаданные. На мой взгляд, это чистый и простой подход, но я бы хотел, чтобы этот общий вариант использования был встроен в mvc.
Возможно, это не самое удачное решение, но оно простое. Вы можете написать расширение для класса 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 .
Я решил эту проблему, создав 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 }) %>
Работает как шарм для меня!