[英]Binding models in ASP.NET MVC-5 controller
我是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;}
}
如果應該將AdDTO
作為視圖模型,則在[HttpDelete]
操作中,不要采用RemoveUserAd
模型。 相反,您需要AdDTO
模型。
然后,在分派命令之前,您可以手動或使用AutoMapper
從視圖模型AdDTO
構造命令。
[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");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.