我对使用MVC不太熟悉。我正在处理这种情况。一切正常,直到调用HttpPost方法,其中所有成员都为null。我不知道为什么不坚持它的所有数据。
一切都运作良好,因为我可以在我的Html页面中看到数据,只有当用户提交信息时才会发生这种情况。
[HttpGet]
public ActionResult DoTest()
{
Worksheet w = new Worksheet(..);
return View(w);
}
[HttpPost]
public ActionResult DoTest(Worksheet worksheet)
{
return PartialView("_Problems", worksheet);
}
这是我正在使用的课程。
public class Worksheet
{
public Worksheet() { }
public Worksheet(string title, List<Problem> problems)
{
this.Title = title;
this.Problems = problems;
}
public Worksheet(IEnumerable<Problem> problems, WorksheetMetadata metadata, ProblemRepositoryHistory history)
{
this.Metadata = metadata;
this.Problems = problems.ToList();
this.History = history;
}
public string Title { get; set; }
public List<Problem> Problems { get; set; } // Problem is an abstract class
public WorksheetMetadata Metadata { get; set; }
public ProblemRepositoryHistory History { get; set; }
}
我的剃刀视图......剃须刀视图成功显示了我的观点。我意识到一些罕见的事情,请注意我的5和6行我有HiddenFor方法,如果我使用它,当调用HTTPPOST持久化数据时,我不知道为什么。
@model Contoso.ExercisesLibrary.Core.Worksheet
<div id="problemList">
<h2>@Html.DisplayFor(model => model.Metadata.ExerciseName)</h2>
@Html.HiddenFor(model => model.Metadata.ExerciseName)
@Html.HiddenFor(model => model.Metadata.ObjectiveFullName)
@for (int i = 0; i < Model.Problems.Count; i++)
{
<div>
@Html.Partial(Contoso.ExercisesLibrary.ExerciseMap.GetProblemView(Model.Problems[i]), Model.Problems[i])
</div>
}
</div>
UPDATE 我正在使用静态类来获取视图名称,但正如我正在测试我只是使用此部分视图
@model Contoso.ExercisesLibrary.AbsoluteArithmetic.Problem1
<div>
<span style="padding:3px; font-size:18px;">@Model.Number1</span>
<span style="padding:5px; font-size:18px;">+</span>
<span style="padding:5px; font-size:18px;">@Model.Number2</span>
<span style="padding:5px; font-size:18px;">=</span>
<span style="font-size:18px">
@Html.EditorFor(model => model.Result, new { style = "width:60px; font-size:18px;" })
@Html.ValidationMessageFor(model => model.Result)
</span>
</div>
@section Scripts {
}
此处用户点击
@model Contoso.ExercisesLibrary.Core.Worksheet
<form method="post">
@Html.Partial("_Problems", Model)
<input type="submit" value="Continue" />
</form>
答案 0 :(得分:2)
Model Binder会将视图“绑定”或链接到模型的input
字段。它不会绑定显示字段(如标签),这就是为什么你需要HiddenFor
它会添加一个<input type="hidden"
,然后在发布时绑定到模型。
答案 1 :(得分:1)
答案 2 :(得分:0)
确保您的表单标记如下所示,例如控制器名称,操作方法,表单方法和表单的ID。我指的是@using声明。在我的例子中,控制器名称是RunLogEntry,操作方法是Create,id是表单。
从视图到控制器的正常发布
@using (Html.BeginForm("Create", "RunLogEntry", FormMethod.Post, new { id = "form", enctype = "multipart/form-data" }))
{
<div id="main">
@Html.Partial("_RunLogEntryPartialView", Model)
</div>
}
如果您想通过Jquery发布,可以执行以下操作:
$.post("/RunLogEntry/LogFileConfirmation",
$("#form").serialize(),
function (data) {
//this is the success event
//do anything here you like
}, "html");
答案 3 :(得分:0)
您必须在视图中指定具有正确属性的表单才能执行后期操作
<form action="Test/DoTest" method="post">
...
</form>
或
@using(Html.BeginForm("DoTest", "Test", FormMethod.Post)) {
...
}
建议使用第二个。
答案 4 :(得分:0)
将整个HTML代码放在:
@using(Html.BeginForm())
标签