2016-11-04 70 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