C#MVC Post表单未将ID从视图传递给控制器

C#MVC Post表单未将ID从视图传递给控制器,c#,asp.net-mvc,post,http-post,C#,Asp.net Mvc,Post,Http Post,我是MVC新手。我在做一个拍卖申请。在拍卖网站上,应该有一个投标表格。将拍卖参数传递给控制器时出现问题 我的模型: public class Auctions { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ID { get; set; } public string title { get; set; } (..) some other fields

我是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; }
}
公共类拍卖
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int ID{get;set;}
公共字符串标题{get;set;}
(……)其他一些领域
公共列表出价=新列表();
}
公共类投标模型
{
公开拍卖auctionToSend{get;set;}
公共双标{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" />

}
@model BiddingViewModel
@使用(Html.BeginForm(“CreateBid”、“Auction”、FormMethod.Post、new{enctype=“multipart/formdata”}))
{
@Html.HiddenFor(model=>model.auctionToSend)
@EditorFor(model=>model.bid)
}
和我的控制器:

[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");
}
[AllowAnonymous]
公共行动结果拍卖页面(int id)
{
var tmp=_context.Auctions.FirstOrDefault(i=>i.ID==ID);
BiddingViewModel bvm=新的BiddingViewModel
{
auctionToSend=tmp,
出价=-1
};
返回视图(bvm);
}
[授权]
[HttpPost]
公共异步任务CreateBid(BiddingViewModel bvm)
{
//从视图中填写表单后,bvm.auctionToSend为空,而bvm.bid值可见
返回操作(“拍卖列表”、“拍卖”);
}

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

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

<input type="hidden" name="auctionToSend" value="yourAssembly.Auctions" ... />
否则,您需要为
Auctions
的每个属性生成一个隐藏输入,但这将是低效的,特别是
Auctions
包含一个集合属性,因此如果您需要POST方法中的
Auctions
对象,最好根据提交的ID值再次获取它


作为补充说明,您确实应该使用一个视图模型,该模型仅包含
双出价
内部拍卖ID

你好,Stephen,谢谢您的回复。我有点困惑。我需要将拍卖从控制器传递到视图(AuctionPage方法),因此在视图中,我的模型需要至少是@Model Auctions。那么,如何仅将这对(auction.ID和bid)传递回控制器?CreateBid函数应该采用什么参数?如果您只使用
@Html.HiddenFor(m=>m.auctionToSend.ID)
,那么
bvm
Auction
属性将在POST方法中初始化,其ID将被绑定(但
Auction
的其他属性将
null
)是的!成功了!非常感谢,再问一个问题。我想你的意思是我“不应该”使用视图模型-因此,如果我想从项目中删除我的视图模型并改用@model Auctions,我如何将auction.ID和bid(用户输入)传递给控制器?不,我的意思是应该。尽管您的
BiddingViewModel
的名称并不真正是视图模型,因为视图模型不应包含数据模型,尤其是在编辑时(例如,
Auctions
的属性为
[必需]
-由于您只回发了
ID
值,因此
ModelState
将始终无效)谢谢!祝你今天愉快!:)
 @Html.HiddenFor(m => m.auctionToSend.ID)