9

这有效:

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.Models.CompPhone’必须是不可为空的值类型,才能将其用作泛型类型或方法‘System.Nullable’中的参数‘T’。

如何将此输入参数设置为方法可选?

这是视图模型

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 });
  }
  ...
}
4

2 回答 2

14

你不是让它成为可选的,你是让它成为可选的nullable。要使其成为可选,您需要为参数定义一个默认值。(仅适用于 C# 4.0 或更高版本):

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

您当前的代码指定为Nullable,它似乎CompPhone 是一个类而不是值类型,并且不能Nullable

CompPhone? cmpPhn相当于Nullable<CompPhone>where CompPhoneshould be astruct

于 2012-09-18T04:22:25.543 回答
1

我同意 Habib,您正在制作参数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; }
  ...
}
于 2012-09-18T04:43:38.290 回答