ASP.NET MVC-5 控制器中的绑定模型
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");
}
Class 'AdDTO' 有 属性 'Id',但是 'RemoveUserAd' class 有 属性 名为 'AdID' .
如何使用 mvc 视图将 AdDTO.Id 传递给 RemoveUserAd.AdId?在本节的视图中绑定models/properties是任意方式:
<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");
}
我是 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");
}
Class 'AdDTO' 有 属性 'Id',但是 'RemoveUserAd' class 有 属性 名为 'AdID' .
如何使用 mvc 视图将 AdDTO.Id 传递给 RemoveUserAd.AdId?在本节的视图中绑定models/properties是任意方式:
<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");
}