簡體   English   中英

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

類“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM