我希望控制器接受/ Details / 1和/ User / xxx但不接受/ User /
我试试下面=>
public ActionResult Details( Nullable<int> id, Nullable<string> name)
{
if (((id ?? 0) == 0) && name == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Instructor instructor = db.Instructors.Where(x => x.InstructorId == id || x.faculty_name.Equals(name)).SingleOrDefault();
if (instructor == null)
{
return HttpNotFound();
}
ViewBag.faculty_active = MyCustomFunctions.UserActivity();
return View(instructor);
}
我希望(上面的豪宅)用户可以通过/详细信息/ 1或/详细信息/ xxx但不能/详情/这就是为什么我添加条件检查=&gt;
if (((id ?? 0) == 0) && name == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
但是我想运行代码,编译器给我的错误类似=&gt; 我认为那是完美的,但我不知道为什么做错了=我试过=&gt;
public ActionResult Details( int? id, string? name)
{
}
这也给了我同样的错误。我搜索了这个问题,我发现=&gt; ASP.NET MVC Overriding Index action with optional parameter
我什么都不懂。这就是为什么我把这种问题放在一边。 如果有人可以帮助我,这将是非常充分的吗?
答案 0 :(得分:4)
string
已经可以为空,因此Nullable<string>
和string?
毫无意义。但是,您不能拥有2个可空参数并实现所需的路径。路由引擎无法知道应绑定哪个参数,如果您使用../Details/xxx
,则两个值都为null
,您将始终返回HttpStatusCode.BadRequest
。
您可以使用两种不同的方法(比如DetailsByID
和DetailsByName
)和路由定义来实现这一点,但是如果您想要一个方法,那么您只能有一个参数来考虑所有3条路线。然后,您可以尝试将值解析为int
public ActionResult Details(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
int number;
Instructor instructor;
bool isInt = Int32.TryParse(id, out number);
if (IsInt)
{
instructor = db.Instructors.Where(x => x.InstructorId == number).SingleOrDefault();
}
else
{
instructor = db.Instructors.Where(x => x.faculty_name.Equals(id)).SingleOrDefault();
}
if (instructor == null)
{
return HttpNotFound();
}
ViewBag.faculty_active = MyCustomFunctions.UserActivity();
return View(instructor);
}
答案 1 :(得分:2)
不要使用Nullable<string>
,因为你不需要也毫无意义。
string
已接受null
值,这意味着已经nullable
。
简短的例子:
string myString=null;
答案 2 :(得分:0)
You need to add Nullable for Value Types, like int,demical,DateTime etc,.
String is a reference type so it allows null by default