Вы можете использовать
<button id="file">select file</button>
<input type="file" name="file" id="file_input" style="display:none;">
<script>
$('#file').click(function() {
$('#file_input').focus().trigger('click');
});
</script>
Удивлен, что никто не упомянул необязательные параметры C # 4.0, которые работают следующим образом:
public void SomeMethod(int a, int b = 0)
{
//some code
}
Изменить : Я знаю, что в то время, когда был задан вопрос, C # 4.0 не существовало. Но этот вопрос по-прежнему занимает первое место в Google по «необязательным аргументам C #», поэтому я подумал, что этот ответ стоит здесь. Прости.
, Если Вы хотите, чтобы время выполнения предоставило значение параметра по умолчанию, необходимо использовать отражение для совершения вызова. Не столь хороший как другие предложения для этого вопроса, но совместимый с VB.NET.
using System;
using System.Runtime.InteropServices;
using System.Reflection;
namespace ConsoleApplication1
{
class Class1
{
public static void sayHelloTo(
[Optional,
DefaultParameterValue("world")] string whom)
{
Console.WriteLine("Hello " + whom);
}
[STAThread]
static void Main(string[] args)
{
MethodInfo mi = typeof(Class1).GetMethod("sayHelloTo");
mi.Invoke(null, new Object[] { Missing.Value });
}
}
}
Типичным путем это обрабатывается в C#, поскольку stephen упомянутый должен перегрузить метод. Путем создания нескольких версий метода с различными параметрами Вы эффективно создаете дополнительные параметры. В формах с меньшим количеством параметров Вы обычно называли бы форму метода со всеми параметрами, устанавливающими Ваши значения по умолчанию в вызове к тому методу.
Вместо параметров по умолчанию, почему не только создают класс словаря из querystring, передал.. реализация, которая почти идентична пути работа форм asp.net с querystrings.
т.е. Запрос. QueryString["a"]
Это разъединит листовой класс от фабрики / шаблонный код.
<час>Вы также могли бы хотеть проверить веб-сервисы с ASP.NET . Веб-сервисы являются веб-API, сгенерированным автоматически через атрибуты на классах C#.
От этого сайта:
http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1
C# действительно позволяет использование [Дополнительного] атрибута (от VB, хотя не функциональный в C#). Таким образом, у Вас может быть метод как это:
using System.Runtime.InteropServices;
public void Foo(int a, int b, [Optional] int c)
{
...
}
В нашей обертке API, мы обнаруживаем дополнительные параметры (ParameterInfo p. IsOptional) и набор значение по умолчанию. Цель состоит в том, чтобы отметить параметры как дополнительные, не обращаясь к клуджам как наличие "дополнительного" на название параметра.
Я соглашаюсь с stephenbayer. Но так как это - веб-сервис, для конечного пользователя легче использовать всего одну форму webmethod, чем использование нескольких версий того же метода. Я думаю в этой ситуации, Типы Nullable идеально подходят для дополнительных параметров.
public void Foo(int a, int b, int? c)
{
if(c.HasValue)
{
// do something with a,b and c
}
else
{
// do something with a and b only
}
}
Другая опция состоит в том, чтобы использовать ключевое слово
public void DoSomething(params object[] theObjects)
{
foreach(object o in theObjects)
{
// Something with the Objects…
}
}
параметрических усилителей, Названное как...
DoSomething(this, that, theOther);
В C# я обычно использовал бы несколько форм метода:
void GetFooBar(int a) { int defaultBValue; GetFooBar(a, defaultBValue); }
void GetFooBar(int a, int b)
{
// whatever here
}
ОБНОВЛЕНИЕ: Это упомянуло выше, БЫЛ способ, которым я сделал значения по умолчанию с C# 2.0. Проекты я продолжаю работать теперь, используют C# 4.0, который теперь непосредственно поддерживает дополнительные параметры. Вот пример, который я просто использовал в своем собственном коде:
public EDIDocument ApplyEDIEnvelop(EDIVanInfo sender,
EDIVanInfo receiver,
EDIDocumentInfo info,
EDIDocumentType type
= new EDIDocumentType(EDIDocTypes.X12_814),
bool Production = false)
{
// My code is here
}
Вы могли использовать перегрузку метода...
GetFooBar() GetFooBar(int a) GetFooBar(int a, int b)
Это зависит от сигнатур методов, пример, который я дал, пропускает "интервал b" только метод, потому что это имело бы ту же подпись как "интервал" метод.
Вы могли использовать типы Nullable...
GetFooBar(int? a, int? b)
Вы могли тогда проверить, с помощью a. HasValue, чтобы видеть, был ли параметр установлен.
Другая опция состояла бы в том, чтобы использовать 'params' параметр.
GetFooBar(params object[] args)
, Если бы Вы хотели пойти с именованными параметрами, был бы должным быть создавать тип для обработки их, хотя я думаю, что уже существует что-то вроде этого для веб-приложений.
Используя перегрузки или C# 4.0 использования или выше
private void GetVal(string sName, int sRoll)
{
if (sRoll > 0)
{
// do some work
}
}
private void GetVal(string sName)
{
GetVal("testing", 0);
}
flashdata
, потому что реальное среднее в таких целях flashdata
, не нормальная сессия. Другая причина состоит в том, что теперь я должен использовать его более ручной путь, потому что я должен думать о сбрасывании сессий сообщения после отображения их.
– Mohammad Naji
28 October 2012 в 14:42
В случае, когда значения по умолчанию не доступны, способ добавить дополнительный параметр состоит в том, чтобы использовать.NET класс OptionalAttribute - https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.optionalattribute? пример view=netframework-4.8
кода ниже:
namespace OptionalParameterWithOptionalAttribute
{
class Program
{
static void Main(string[] args)
{
//Calling the helper method Hello only with required parameters
Hello("Vardenis", "Pavardenis");
//Calling the helper method Hello with required and optional parameters
Hello("Vardenis", "Pavardenis", "Palanga");
}
public static void Hello(string firstName, string secondName,
[System.Runtime.InteropServices.OptionalAttribute] string fromCity)
{
string result = firstName + " " + secondName;
if (fromCity != null)
{
result += " from " + fromCity;
}
Console.WriteLine("Hello " + result);
}
}
}
Немного поздно на вечеринку, но я искал ответ на этот вопрос и в итоге разобрался еще один способ сделать это. Объявите типы данных для необязательных аргументов вашего веб-метода как тип XmlNode. Если необязательный аргумент опущен, для него будет установлено значение null, и если он присутствует, вы можете получить строковое значение, вызвав arg.Value, то есть
[WebMethod]
public string Foo(string arg1, XmlNode optarg2)
{
string arg2 = "";
if (optarg2 != null)
{
arg2 = optarg2.Value;
}
... etc
}
Что также достойно в этом подходе, так это созданная .NET домашняя страница для ws по-прежнему показывает список аргументов (хотя вы теряете удобные поля ввода текста для тестирования).
У меня есть веб-служба для записи, которая принимает 7 параметров. Каждый из них является необязательным атрибутом запроса к sql-оператору, обёрнутому этим веб-сервисом. Таким образом, на ум приходят два обходных пути к неопциональным параметрам... оба довольно бедные:
method1(параметр1, параметр2, параметр3, параметр4, параметр5, параметр6, параметр7). метод1(параметр1, параметр2, параметр3, параметр4, параметр5, параметр6) метод 1(параметр1, параметр2, параметр3, параметр4, параметр5, параметр7)... начинайте видеть картинку. Таким образом, лежит безумие. Слишком много комбинаций.
Теперь для более простого способа, который выглядит неловко, но должен работать: метод1(param1, bool useParam1, param2, bool useParam2 и т.д...)
Это один вызов метода, нужны значения для всех параметров, и он будет обрабатывать каждый случай внутри него. Также понятно, как его использовать из интерфейса.
Это взлом, но он будет работать.