ActionResult 没有正确获取参数
ActionResult not correctly getting parameter
在我的 Home/Index 视图中,我有一个列表视图,它显示带有照片的卡片和所有上传的详细信息,每张卡片都包含一个操作 link 点击每张卡片:
@model IEnumerable<FunPetPics.Models.PetPhotoModel>
@{
ViewData["Title"] = "Home Page";
}
@if (Model == null || !Model.Any())
{
<p>uploads will be displayed here</p>
}
else
{
@using (Html.BeginForm("Index", "Home", FormMethod.Get))
{
@await Html.PartialAsync("_PetPhotoModelFilter")
}
<div class="card-columns">
@foreach (var upload in Model)
{
<a href='@Url.Action( "Rate", "Details", upload.Id )'>
<div class="card">
<img class="card-img-top" src="@("~/UploadedPhotos/"+ upload.ImageName)" asp-append-version="true">
<div class="card-body">
<h4 class="card-title">@upload.Title</h4>
<h6 class="card-subtitle mb-2 text-muted">@upload.PetName</h6>
<p class="card-text">@upload.DateUploaded</p>
<p class="card-text">@upload.Description</p>
<p class="card-subtitle">Ratings:</p>
<p class="card-text">
Cute:@upload.AverageCutenessRating/5<br />
Funny:@upload.AverageFunnynessRating/5<br />
Awsome:@upload.AverageAwsomnessRating/5<br />
</p>
</div>
</div>
</a>
}
</div>
详细信息控制器:
using FunPetPics.Data;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
namespace FunPetPics.Controllers
{
public class DetailsController : ControllerBase
{
public DetailsController(FunPetPicsContext context) : base(context)
{
}
[HttpGet]
//[Route("Details/Rate/{id}")] when I add this the controller doesn't work and I get page not found
public IActionResult Rate(int id)
{
var model = _context.PetPhotos.FirstOrDefault(p => p.Id == id);
return View(model);
}
}
}
目前,Details/Rate 视图仅显示照片,直到我可以让其余部分工作:
@using Microsoft.AspNetCore.Http;
@model PetPhotoModel
@{
<img src="@("~/UploadedPhotos/"+ ((PetPhotoModel)Model).ImageName)" asp-append-version="true">
}
当浏览器显示 Home/Index 页面的 link 时,我会转到 https://localhost:44316/Rate/Details
(为什么没有 id?)和 id
控制器是 0(不是正确的)。
我也试过将此属性添加到控制器的 Rate()
方法中:[Route("Details/Rate/{id}")]
但是控制器中没有断点,它显示找不到具有相同 URL 的页面。
您没有正确使用 Url.Action
。保留 Route
属性,并更改您的视图以改为使用它,请注意它如何使用匿名对象来允许 MVC link id
值到匹配参数:
@Url.Action( "Rate", "Details", new { id = upload.Id })
在我的 Home/Index 视图中,我有一个列表视图,它显示带有照片的卡片和所有上传的详细信息,每张卡片都包含一个操作 link 点击每张卡片:
@model IEnumerable<FunPetPics.Models.PetPhotoModel>
@{
ViewData["Title"] = "Home Page";
}
@if (Model == null || !Model.Any())
{
<p>uploads will be displayed here</p>
}
else
{
@using (Html.BeginForm("Index", "Home", FormMethod.Get))
{
@await Html.PartialAsync("_PetPhotoModelFilter")
}
<div class="card-columns">
@foreach (var upload in Model)
{
<a href='@Url.Action( "Rate", "Details", upload.Id )'>
<div class="card">
<img class="card-img-top" src="@("~/UploadedPhotos/"+ upload.ImageName)" asp-append-version="true">
<div class="card-body">
<h4 class="card-title">@upload.Title</h4>
<h6 class="card-subtitle mb-2 text-muted">@upload.PetName</h6>
<p class="card-text">@upload.DateUploaded</p>
<p class="card-text">@upload.Description</p>
<p class="card-subtitle">Ratings:</p>
<p class="card-text">
Cute:@upload.AverageCutenessRating/5<br />
Funny:@upload.AverageFunnynessRating/5<br />
Awsome:@upload.AverageAwsomnessRating/5<br />
</p>
</div>
</div>
</a>
}
</div>
详细信息控制器:
using FunPetPics.Data;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
namespace FunPetPics.Controllers
{
public class DetailsController : ControllerBase
{
public DetailsController(FunPetPicsContext context) : base(context)
{
}
[HttpGet]
//[Route("Details/Rate/{id}")] when I add this the controller doesn't work and I get page not found
public IActionResult Rate(int id)
{
var model = _context.PetPhotos.FirstOrDefault(p => p.Id == id);
return View(model);
}
}
}
目前,Details/Rate 视图仅显示照片,直到我可以让其余部分工作:
@using Microsoft.AspNetCore.Http;
@model PetPhotoModel
@{
<img src="@("~/UploadedPhotos/"+ ((PetPhotoModel)Model).ImageName)" asp-append-version="true">
}
当浏览器显示 Home/Index 页面的 link 时,我会转到 https://localhost:44316/Rate/Details
(为什么没有 id?)和 id
控制器是 0(不是正确的)。
我也试过将此属性添加到控制器的 Rate()
方法中:[Route("Details/Rate/{id}")]
但是控制器中没有断点,它显示找不到具有相同 URL 的页面。
您没有正确使用 Url.Action
。保留 Route
属性,并更改您的视图以改为使用它,请注意它如何使用匿名对象来允许 MVC link id
值到匹配参数:
@Url.Action( "Rate", "Details", new { id = upload.Id })