我是ASP.NET MVC的初学者。我对MVC控制器中的模型类型有问题。这是我的控制器:
public async Task<IActionResult> DeleteAd(Guid id)
{
AdDTO ad = await _userAdService.GetAdDTOAsync(UserId,id);
return View(ad);
}
[HttpDelete]
public async Task<IActionResult> DeleteAd(RemoveUserAd command)
{
await DispatcheAsync<RemoveUserAd>(command);
return RedirectToAction("AllAds","UserAd");
}类'AdDTO‘具有属性'Id',而'RemoveUserAd’类具有名为'AdID‘的属性。
如何使用mvc视图将AdDTO.Id传递给RemoveUserAd.AdId?本节中查看的任何绑定模型/属性的方法:
<form asp-action="DeleteAd">
<input type="hidden" asp-for="Id" />
<input type="submit" value="DeleteAd" class="btn btn-default" /> |
<a asp-action="Index">Back to List</a>
</form>查看代码:
@model AdPortal.Infrastructure.DTO.AdDTO
@{
ViewData["Title"] = "Delete";
}
<h2>Details</h2>
<div>
<h4>Ad</h4>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.Name)
</dt>
<dd>
@Html.DisplayFor(model => model.Name)
</dd>
<dt>
@Html.DisplayNameFor(model => model.Content)
</dt>
<dd>
@Html.DisplayFor(model => model.Content)
</dd>
<dt>
@Html.DisplayNameFor(model => model.AddDate)
</dt>
<dd>
@Html.DisplayFor(model => model.AddDate)
</dd>
<dt>
@Html.DisplayNameFor(model => model.ExpiryDate)
</dt>
<dd>
@Html.DisplayFor(model => model.ExpiryDate)
</dd>
</dl>
</div>
<div>
<form asp-action="DeleteAd">
<input type="hidden" asp-for="Id" />
<input type="submit" value="DeleteAd" class="btn btn-default" /> |
<a asp-action="Index">Back to List</a>
</form>
</div>
AdDTO模型
public class AdDTO
{
public Guid Id{get; set;}
public string Name {get;set;}
public string Content {get;set;}
public DateTime AddDate {get; set;}
public DateTime ExpiryDate {get; set;}
public string UserId {get; set;}
public Guid UserName {get;set;}
}RemoveUserAd命令模型
public class RemoveUserAd
{
public Guid AdId {get; set;}
}发布于 2017-10-13 17:01:52
如果AdDTO应该是视图模型,那么在您的[HttpDelete]操作中,不使用RemoveUserAd模型。相反,您可以使用AdDTO模型。
然后,在分发命令之前,您可以手动或使用AdDTO从视图模型AutoMapper构造该命令。
[HttpDelete]
public async Task<IActionResult> DeleteAd(AdDTO model)
{
var command = new RemoveUserAd
{
AdId = model.Id,
....
};
await DispatcheAsync<RemoveUserAd>(command);
return RedirectToAction("AllAds","UserAd");
}旁注
在您的表单上,不需要指定method="delete"
在你的Controller上,你不需要[ValidateAntiForgeryToken]吗?或者让它启用全局config.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
来自评论的反馈
如果您担心OverPosting,那么在操作中只需使用Id而不是整个AdDTO模型。
[HttpDelete]
public async Task<IActionResult> DeleteAd(Guid id)
{
var command = new RemoveUserAd
{
AdId = id,
....
};
await DispatcheAsync<RemoveUserAd>(command);
return RedirectToAction("AllAds","UserAd");
}https://stackoverflow.com/questions/46734406
复制相似问题