具有可选参数的.net MVC操作

时间:2017-05-16 08:54:27

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我希望控制器接受/ 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; enter image description here 我认为那是完美的,但我不知道为什么做错了=我试过=&gt;

    public ActionResult Details( int? id, string? name)
    {
    }

这也给了我同样的错误。我搜索了这个问题,我发现=&gt; ASP.NET MVC Overriding Index action with optional parameter

我什么都不懂。这就是为什么我把这种问题放在一边。 如果有人可以帮助我,这将是非常充分的吗?

3 个答案:

答案 0 :(得分:4)

string已经可以为空,因此Nullable<string>string?毫无意义。但是,您不能拥有2个可空参数并实现所需的路径。路由引擎无法知道应绑定哪个参数,如果您使用../Details/xxx,则两个值都为null,您将始终返回HttpStatusCode.BadRequest

您可以使用两种不同的方法(比如DetailsByIDDetailsByName)和路由定义来实现这一点,但是如果您想要一个方法,那么您只能有一个参数来考虑所有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