如何将可选参数传递给ActionResult

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:在泛型类型或方法'System.Nullable'中使用参数'T'时,类型'MyProject.Models.CompPhone' 必须是非空值类型。"

请问我该如何将这个输入参数设为可选的?

以下是视图模型:

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个回答

14

你并没有使它变为可选的,而是使它变为了nullable。要使它变为可选,您需要为参数定义一个默认值。(这仅适用于C# 4.0或更高版本):

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

你当前的代码指定了要使用 Nullable,但是看起来 CompPhone 是一个类而不是值类型,因此不能使用 Nullable

CompPhone? cmpPhn 等同于 Nullable<CompPhone>,其中 CompPhone 应该是一个 struct


感谢Habib澄清了可空和可选之间的微妙差别。我更喜欢你的答案,因为它不需要复制该方法。是的,CompPhone是一个类。 - Joe
@Joe,rablinz的回答也是有效的,但如果您使用的是.NET框架4.0或更高版本,则它带有C# 4.0,其中包含方法的默认参数选项。在此之前的版本中,您必须适应rablinz的答案。 - Habib
我已经在我的问题中添加了调用方法。你回答了如何将类放入方法中。我有一个后续问题,如何从方法中传递一个类。当我调试调用方法时,id而不是cmpPhn被添加到路由值中。谢谢。 - Joe
感谢@Joe使用nullable并指出区别,我之前一直混淆这两个概念,直到看到这篇文章才恍然大悟,真是我的幸运日! - gawkface

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接