【问题标题】:.net MVC Action with Optional Parameters带有可选参数的 .net MVC 操作
【发布时间】:2017-05-16 17:48:13
【问题描述】:

我希望控制器接受 /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);
    }

我希望(上面的豪宅)用户可以通过 /Details/1 或 /Details/xxx 但不能通过 /Details/ 这就是我添加条件检查的原因=>

        if (((id ?? 0) == 0) && name == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

但我想运行编译器给我的错误代码,例如=> 我在想那是完美的,但我不知道为什么做错了=我试过=>

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

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

我什么都不懂。这就是我提出这类问题的原因。 如果有人可以帮助我,这将是非常完整的吗?

【问题讨论】:

  • string 已经可以为空。但是您不能将 2 个可空值作为参数并使用路由(您将只能生成 /Details?name=xxx - 如果您要使用 /Details/xxx 两个参数将是 null 并且您的代码将始终返回 BadRequest
  • @StephenMuecke public ActionResult Details(int id = 0, string name = null) 是向我返回一个错误的请求....有什么办法可以解决这个问题或者我需要遵循其他结构
  • 只有一个参数(string),然后检查是否可以解析为int
  • @StephenMuecke 我能理解你能给我举个小例子吗?
  • 给我 20 分钟,我会添加答案。

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


【解决方案1】:

string 已经可以为空,所以 Nullable&lt;string&gt;string? 没有意义。但是,您不能有 2 个可为空的参数并实现您想要的路线。路由引擎无法知道应该绑定哪些参数,如果您使用../Details/xxx,这两个值都将是null,您将始终返回HttpStatusCode.BadRequest

您可以使用 2 个单独的方法(例如 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);
}

【讨论】:

    【解决方案2】:

    不要使用Nullable&lt;string&gt;,因为你不需要也没有意义。

    string 已经接受 null 值,这意味着已经是 nullable

    简短示例:

    string myString=null;
    

    【讨论】:

      【解决方案3】:

      您需要为值类型添加 Nullable,例如 int、demical、DateTime 等。

      String 是引用类型,所以默认允许为 null

      【讨论】:

        猜你喜欢
        • 2012-04-11
        • 2016-11-17
        • 2014-11-10
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多