2016-11-04 49 views
1

你好我试图建立在我的网站,现在一些物理的文章评论部分我想,当我在解析路由参数

<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> 

现在我的问题:我将如何去提取我的控制器中的articleid?到目前为止,我试过这个

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(); 

将返回完整的URL字符串包括“条款ArticleID =不便的价值。

+0

你确定你没有任何其他问题吗?你也确定当你点击CreateNew它会调用你上面指定的Create方法。 – dotnetstep

+0

是的,它似乎一切工作,因为我想用我提供的解决方案,说实话,可能有更好的解决方案,我是远离有经验的程序员,但该解决方案现在做的伎俩,所以我不抱怨 – lobito

回答

0

如果我明白我的问题,那么你有以下问题。

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

  2. 现在,当您单击该链接您的创建方法被调用,它将返回您已指定的视图。 (这时如果你在你的方法中看到articleId,那么它会有这个值)。

  3. 现在,你在评论和价值评估后,你提交表单。那时你将无法找到articleId。这是因为articleId没有保存在任何地方。

如果上面是你的问题,那么下面将解决你的问题。

解决方案。

在控制器创建两个方法

GET方法,当您单击创建新会调用。当你提交表单时,会调用另一个。

  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我已经创建隐藏字段)

<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> 

我希望这个解决方案将帮助你。

+0

谢谢你这似乎比我提供的更好的解决方案。但是,据我所知,这只是创建功能的第一步,所以可以将评论添加到我写的物理文章中。最后,我将提交表单移入文章本身,并将方法名称用作articleId。 – lobito