解析路由参数

时间:2016-11-04 19:42:33

标签: c# asp.net-core

您好我正在尝试为我网站上的一些物理文章构建评论部分,现在我想点击

<a asp-route-articleid="smth" asp-action="Create">Create New</a>

它会创建一个包含网址的页面:http://localhost:65401/Physics/Create?articleid=smth

<h2>Create</h2>

<form asp-action="Create">
    <div class="form-horizontal">
        <h4>Physics</h4>
        <hr />
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="CommentContext" class="col-md-2 control-label"></label>
            <div class="col-md-10">
                <input asp-for="CommentContext" class="form-control" />
                <span asp-validation-for="CommentContext" class="text-danger" />
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
</form>

现在我的问题:如何在控制器中提取该文章?到目前为止我试过这个

 public async Task<IActionResult> Create([Bind("ID,CommentContext,UserName,ArticleID")] Physics physics, string articleid)
    {
        if (ModelState.IsValid)
        {
            physics.UserName = HttpContext.User.Identity.Name;
            physics.ArticleID = articleid;

            _context.Add(physics);
            await _context.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        return View(physics);
    }
到目前为止,还有其他绝望的尝试。任何帮助,将不胜感激。

编辑:

使用HttpContext.Request.GetEncodedUrl();获取http://localhost:65401/Physics/Create,但关键是我需要articleid=smth值。

解决方案:

Request.Headers["Referer"].ToString();

将返回包含'articleid = smth'值的完整网址字符串。

1 个答案:

答案 0 :(得分:0)

如果我理解我的问题,那么你有以下问题。

  1. 您在一个页面上创建了按钮并生成了您描述的链接。 http://localhost:65401/Physics/Create?articleid=smth

  2. 现在,当您单击该链接时,您的create方法将被调用,它将返回您指定的View。 (此时如果您在方法中查看articleId,那么它将具有该值)。

  3. 现在,您在评论中评价并提交表格。那时你将无法找到articleId。这是因为articleId不保留在任何地方。

  4. 如果以上是您的问题,那么以下内容将解决您的问题。

    <强>解。

    在Controller中创建两个方法

    获取单击“新建”时将调用的方法。提交表单时会调用另一个。

    1. 控制器

      [HttpGet]
      public async Task<IActionResult> Create(string articleId)
      {
          Physics t = new Physics();
          if(!string.IsNullOrEmpty(articleId))
          {
              t.ArticleID = articleId;
          }
          return View(t);
      }
      
      [HttpPost]
      public async Task<IActionResult> Create([Bind("ID,CommentContext,UserName,ArticleID")]Physics physics)
      {
          if (ModelState.IsValid)
          {
              physics.UserName = HttpContext.User.Identity.Name;               
      
              //_context.Add(physics);
              //await _context.SaveChangesAsync();
              return RedirectToAction("Index");
          }
          return View(physics);
      }
      
    2. 在您看来,我做了一些小改动,所以articleId会保留。 (参见我为articleId创建了隐藏字段)

    3. <h2>Create</h2>
      <form asp-action="Create">
          <div class="form-horizontal">
              <input asp-for="ArticleID" type="hidden" />
              <h4>Physics</h4>
              <hr />
              <div asp-validation-summary="ModelOnly" class="text-danger"></div>
              <div class="form-group">
                  <label asp-for="CommentContext" class="col-md-2 control-label"></label>
                  <div class="col-md-10">
                      <input asp-for="CommentContext" class="form-control" />
                      <span asp-validation-for="CommentContext" class="text-danger" />
                  </div>
              </div>
              <div class="form-group">
                  <div class="col-md-offset-2 col-md-10">
                      <input type="submit" value="Create" class="btn btn-default" />
                  </div>
              </div>
          </div>
      </form>
      

      我希望这个解决方案可以帮到你。