Как передать необязательный параметр в ActionResult

это работает:

public ActionResult Edit(int id, CompPhone cmpPhn)
{
  var vM = new MyViewModel();
  if (cmpPhn != null) { vM.CmpPhnF = cmpPhn; }
  ...
}

если я сделаю cmpPhn необязательным:

public ActionResult Edit(int id, CompPhone? cmpPhn)

Я получаю "Ошибка 1 тип" MyProject.Модели.CompPhone "должен быть типом значения, не имеющим значения null, чтобы использовать его в качестве параметра" T " в системе универсального типа или метода.Значения null'.

как я могу сделать этот входной параметр для метода необязательным?

вот модель вида

public class MyViewModel : IValidatableObject
{
...
public CompPhone CmpPhnF { get; set; }    
...
}

вызов метода

[HttpPost, ValidateAntiForgeryToken]
public ActionResult PhoneTest(MyViewModel vM)
{
  if (ModelState.IsValid)
  { var cmpPhn = vM.CmpPhnF;
  return RedirectToAction("Edit", new { id = vM.AcntId, cmpPhn });
  }
  ...
}

2 ответов


вы не делаете это необязательным, вы делаете это nullable. Чтобы сделать его необязательным, необходимо определить значение по умолчанию для параметра. (Доступно только для C# 4.0 или выше):

public ActionResult Edit(int id, CompPhone cmpPhn = null)

ваш текущий код указывает быть Nullable и кажется, что CompPhone является классом, а не типом значения, и не может быть Nullable.

CompPhone? cmpPhn эквивалентно Nullable<CompPhone> здесь CompPhone должно быть struct


Я согласен с Хабибом, вы делаете параметр nullable.

чтобы сделать параметр необязательным, определите два идентичных метода: один с параметром и один без. Тот, у кого нет, должен будет использовать для него предопределенное значение по умолчанию.

public ActionResult Edit(int id)
{
  var vM = new MyViewModel();
  vM.CmpPhnF = defaultValue;
  ...
}

и

public ActionResult Edit(int id, CompPhone cmpPhn)
{
  var vM = new MyViewModel();
  if (cmpPhn != null) { vM.CmpPhnF = cmpPhn; }
  ...
}