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");
}