【问题标题】:C# MVC Post form not passing ID from view to controllerC# MVC Post 表单未将 ID 从视图传递到控制器
【发布时间】:2016-08-20 09:22:34
【问题描述】:

我是 MVC 的新手。我正在处理一个拍卖应用程序。在拍卖网站上,应该有一个投标表格。我在将拍卖参数传递给控制器​​时遇到问题

我的模特:

public class Auctions
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public string title { get; set; }
    (..) some other fields
    public List<Bid> bids = new List<Bid>(); 
}

public class BiddingViewModel
{
    public Auctions auctionToSend { get; set; }
    public double bid { get; set; }
}

我的看法:

@model BiddingViewModel

@using(Html.BeginForm("CreateBid", "Auction", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.HiddenFor(model=>model.auctionToSend)
    @Html.EditorFor(model => model.bid)
    <input type="submit" value="Make it work" />

}

和我的控制器:

[AllowAnonymous]
public ActionResult AuctionPage(int id)
{
    var tmp = _context.Auctions.FirstOrDefault(i => i.ID == id);

    BiddingViewModel bvm = new BiddingViewModel
    {
        auctionToSend = tmp,
        bid = -1
    };

    return View(bvm);
}


[Authorize]
[HttpPost]
public async Task<ActionResult> CreateBid(BiddingViewModel bvm)
{
    //After filling the form from view, the bvm.auctionToSend is null, whereas the bvm.bid value is visible
    return RedirectToAction("AuctionList", "Auction");
}

我的问题是拍卖数据(在视图中完全可见)没有发送回控制器。我检查了互联网,它向我展示了一些命名冲突的解决方案,所以我确保命名不同,但这并没有解决我的问题。

【问题讨论】:

    标签: c# asp.net-mvc post http-post


    【解决方案1】:

    auctionToSend 是一个复杂对象,您对@Html.HiddenFor(model=&gt;model.auctionToSend) 的使用正在生成

    <input type="hidden" name="auctionToSend" value="yourAssembly.Auctions" ... />
    

    如果你只需要Auctions的ID,那么使用

     @Html.HiddenFor(m => m.auctionToSend.ID)
    

    否则您需要为Auctions 的每个属性生成一个隐藏输入,但这将是低效的,特别是当Auctions 包含一个作为集合的属性时,因此如果您在POST 方法中需要Auctions 对象,最好根据您提交的 ID 值重新获取。

    附带说明,您确实应该使用仅具有 double Bid 和 int AuctionID 属性的视图模型

    【讨论】:

    • 您好,斯蒂芬,感谢您的回复。我有点困惑。我需要将拍卖从控制器传递到视图(AuctionPage 方法),因此在视图中我的模型至少需要为@model Auctions。那么如何仅将这对(auction.ID 和bid)传递回控制器? CreateBid 函数应采用哪些参数?
    • 如果只使用@Html.HiddenFor(m =&gt; m.auctionToSend.ID),那么bvm的Auction属性会在POST方法中初始化并绑定其ID(但Auction的其他属性为@ 987654335@)
    • 是的!有效!非常感谢 - 再问一个问题。我认为您的意思是我“不应该”使用视图模型-因此,如果我想从项目中删除我的视图模型并改用@model Auctions,我将如何将auction.ID 和bid(用户输入)传递给控制器?
    • 不,我的意思是应该。尽管您的 BiddingViewModel 的名称不是真正的视图模型,因为视图模型不应该包含数据模型,尤其是在编辑时(例如,Auctions 的属性有 [Required] - 因为您只发回 ID 值,然后 ModelState 将始终无效)
    • 谢谢!祝你今天过得愉快! :)
    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多