Так как вы не пытаетесь опубликовать коллекцию в одном представлении, вам нужно потерять указатель на название модели.
Tasks[0].TaskId
Настройте ваши взгляды. Имя переменной «задача» должно соответствовать параметру действия, поскольку HtmlHelpers будет генерировать атрибуты имени на основе этой строки.
@model Checkpoint.Models.Checklist
<table>
@foreach(Task task in Model.Tasks)
{
@Html.EditorFor(m => task)
}
</table>
Рендеринг html выглядит примерно как
<input id="task_TaskId" name="task.TaskId" type="hidden" value="1">
...
Для действия требуется параметр «task» для сопоставления, чтобы связать его значения
[HttpPost]
public ActionResult Index(Task task)
{
return Content($"Save Task:{task.TaskId} Value:{task.IsDone}");
}
Если мы используем частичное представление вместо шаблона редактора мы можем немного ослабить зависимость имени от «задачи».
@model Checkpoint.Models.Checklist
<table>
@foreach(Task t in Model.Tasks)
{
@Html.PartialView("_TaskForm", t)
}
</table>
И ваш шаблонный редактор будет работать точно так же.
_TaskForm
@model Checkpoint.Models.Task
<tr>
<td>@Model.TaskName</td>
<td data-ftid="@Model.TaskId">
@{
using (Html.BeginForm("Index", "Check", FormMethod.Post))
{
@Html.HiddenFor(x => x.TaskId)
@Html.RadioButtonFor(x => x.IsDone, false)<span>Incomplete</span>
@Html.RadioButtonFor(x => x.IsDone, true)<span>Complete</span>
<button role="button" type="submit" name="taskAction">Submit</button>
}
}
</td>
</tr>
И отрендеренный html
<input id="TaskId" name="TaskId" type="hidden" value="1">
...
Гоча со всем вышеупомянутым атрибутом html id
не будет уникальным. Поэтому, если это важно, вам нужно будет вручную выполнить итерацию коллекции, чтобы построить каждую форму вручную, чтобы вы могли точно указать значения идентификатора. То есть вы потеряете небольшие модульные редакторы шаблонов.
Позволяя фреймворку автоматически генерировать «уникальные» идентификаторы ... мы переопределяем атрибут name (обратите внимание на прописную букву для «Name»), который мы имеем:
@model Checkpoint.Models.Checklist
<table>
@for(int i = 0; i < Model.Tasks.Count; i++)
{
<tr>
<td>@Model.Tasks[i].TaskName</td>
<td data-ftid="@Model.Tasks[i].TaskId">
@using (Html.BeginForm("Index", "Check", FormMethod.Post))
{
@Html.HiddenFor(x => Model.Tasks[i].TaskId, new { Name="TaskId" })
@Html.RadioButtonFor(x => Model.Tasks[i].IsDone, false, new { Name="IsDone" })<span>Incomplete</span>
@Html.RadioButtonFor(x => Model.Tasks[i].IsDone, true, new { Name="IsDone" })<span>Complete</span>
<button role="button" type="submit" name="taskAction">Submit</button>
}
</td>
</tr>
}
</table>
Вместо
<a href="http://fbapp.mysite.com/page1">link</a>
Использовать
<a href="http://apps.facebook.com/{canvasurl}/page1" target="_top">link</a>
Это загрузит URL в самом верхнем кадре (сам Facebook), и Facebook автоматически проходит через любые аргументы (пути И строки запроса) к Вашему URL обратного вызова.
FB_RequireFeatures(["CanvasUtil"], function() {
FB.Facebook.init(<api_key>, <path to xd_receiver>);
FB.CanvasClient.startTimerToSizeToContent();
FB.CanvasClient.syncUrl();
});