C# 模型在POST中未完全绑定
不明白我在这里监督什么。。。 我有一个在视图中渲染的模型 这是SubscriptionViewModel:C# 模型在POST中未完全绑定,c#,asp.net-mvc,post,model-view-controller,model,C#,Asp.net Mvc,Post,Model View Controller,Model,不明白我在这里监督什么。。。 我有一个在视图中渲染的模型 这是SubscriptionViewModel: public Subscription Subscription { get; set; } public DayOfWeek DayOfWeek { get; set; } public List<DateTime> SomeDates { get; set; } 这是正在触发的SubscriptionConteller方法: [AllowAnonymous] publ
public Subscription Subscription { get; set; }
public DayOfWeek DayOfWeek { get; set; }
public List<DateTime> SomeDates { get; set; }
这是正在触发的SubscriptionConteller方法:
[AllowAnonymous]
public ActionResult Subscribe(SubscriptionViewModel model, string date)
{
return View();
}
帖子被触发,我的模型不为空,日期参数也具有正确的值,唯一丢失的是来自我的SubscriptionViewModel的订阅实体的参数。它们不是空的,但在最初进入视图时没有初始值
不知道我在监督什么,我试着在视图中使用TempData.Keep()
(我以前从来没有这样做过),但这也不起作用
欢迎任何建议!
谢谢大家! 此答案假设您不希望订阅的值来自表单,而是希望保持最初将值发送到视图时的状态,这听起来像是您所追求的 您需要使用隐藏字段在表单中包含订阅的值(请参见示例1)。或者,您需要以与get方法相同的方式在post方法中填充订阅(参见示例2) 这里有两个简单的例子来说明我的意思 假设这是您的订阅类
public class Subscription
{
public int Id { get; set; }
public string Name { get; set; }
}
示例1
希登菲尔德之路
控制器
public class SubscriptionController : Controller
{
[AllowAnonymous]
public ActionResult Subscribe()
{
var viewModel = new SubscriptionViewModel
{
Subscription = GetSubscription()
};
return View(viewModel);
}
[AllowAnonymous]
[HttpPost]
public ActionResult Subscribe(SubscriptionViewModel model, string date)
{
return View();
}
private Subscription GetSubscription()
{
return new Subscription
{
Id = 1,
Name = "My Subscription"
};
}
}
public class SubscriptionController : Controller
{
[AllowAnonymous]
public ActionResult Subscribe()
{
var viewModel = new SubscriptionViewModel
{
Subscription = GetSubscription()
};
return View(viewModel);
}
[AllowAnonymous]
[HttpPost]
public ActionResult Subscribe(SubscriptionViewModel model, string date)
{
model.Subscription = GetSubscription();
return View();
}
private Subscription GetSubscription()
{
return new Subscription
{
Id = 1,
Name = "My Subscription"
};
}
}
景色
@model {The namespace}.SubscriptionViewModel
@using (Html.BeginForm("Subscribe", "Subscription", FormMethod.Post))
{
//Other fields
@Html.HiddenFor(x => x.Subscription.Id)
@Html.HiddenFor(x => x.Subscription.Name)
<input type="submit" value="submit" />
}
@model {The namespace}.SubscriptionViewModel
@using (Html.BeginForm("Subscribe", "Subscription", FormMethod.Post))
{
//Other fields
<input type="submit" value="submit" />
}
景色
@model {The namespace}.SubscriptionViewModel
@using (Html.BeginForm("Subscribe", "Subscription", FormMethod.Post))
{
//Other fields
@Html.HiddenFor(x => x.Subscription.Id)
@Html.HiddenFor(x => x.Subscription.Name)
<input type="submit" value="submit" />
}
@model {The namespace}.SubscriptionViewModel
@using (Html.BeginForm("Subscribe", "Subscription", FormMethod.Post))
{
//Other fields
<input type="submit" value="submit" />
}
@model{The namespace}.SubscriptionViewModel
@使用(Html.BeginForm(“Subscribe”、“Subscription”、FormMethod.Post))
{
//其他领域
}
您的数据检索是什么样子的?当您的表单中只有超链接时,post是如何触发的?@JasonRoner,您的意思是在呈现模型之前我是如何填充模型的?@DaveBarnett,@Html.ActionLink(“文本”、“取消订阅”…)指向应该发布模型的操作。我在网上的一个例子中看到了这一点。这会给你一个超链接,这意味着表单不会被发布。您将通过一个get请求进入subscribe方法,该请求可以工作,但不是正确的方式。我想首先用我填充的模型中的数据加载视图,视图的目的是让用户选择一个日期,帖子应该将该日期添加到模型中的初始数据中,因此我想我不应该使用@Html.ActionLink(…)但输入字段?将尝试此操作并发回,谢谢您的建议和信息!是的,这很有意义。将日期信息添加为隐藏字段。不客气!我这样做了,但我的控制器参数(模型)仍有空值.我不知道模型本身不是空的,只是模型的属性是未分配的…它似乎失去了值,但仍然保持它的实例(不是空的).有什么建议吗?好的,我把某些事情搞混了,需要重新考虑我所做的是好是坏。现在,我在加载和显示视图时,在模型中有我需要的所有值,除了我希望用户选择的日期。因此,我只有一个razor helper,HiddenFor允许我检索所选的日期(感谢您@Dave Barnett)但我不明白为什么我的模型在到达控制器时没有它的值,是因为我需要在Html.BeginForm(…)范围内定义所有模型的属性吗?是的,它需要在每个Html.BeginForm()中都有它们。